162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/ethtool_netlink.h>
462306a36Sopenharmony_ci#include <linux/net_tstamp.h>
562306a36Sopenharmony_ci#include <linux/phy.h>
662306a36Sopenharmony_ci#include <linux/rtnetlink.h>
762306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "common.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciconst char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
1262306a36Sopenharmony_ci	[NETIF_F_SG_BIT] =               "tx-scatter-gather",
1362306a36Sopenharmony_ci	[NETIF_F_IP_CSUM_BIT] =          "tx-checksum-ipv4",
1462306a36Sopenharmony_ci	[NETIF_F_HW_CSUM_BIT] =          "tx-checksum-ip-generic",
1562306a36Sopenharmony_ci	[NETIF_F_IPV6_CSUM_BIT] =        "tx-checksum-ipv6",
1662306a36Sopenharmony_ci	[NETIF_F_HIGHDMA_BIT] =          "highdma",
1762306a36Sopenharmony_ci	[NETIF_F_FRAGLIST_BIT] =         "tx-scatter-gather-fraglist",
1862306a36Sopenharmony_ci	[NETIF_F_HW_VLAN_CTAG_TX_BIT] =  "tx-vlan-hw-insert",
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	[NETIF_F_HW_VLAN_CTAG_RX_BIT] =  "rx-vlan-hw-parse",
2162306a36Sopenharmony_ci	[NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
2262306a36Sopenharmony_ci	[NETIF_F_HW_VLAN_STAG_TX_BIT] =  "tx-vlan-stag-hw-insert",
2362306a36Sopenharmony_ci	[NETIF_F_HW_VLAN_STAG_RX_BIT] =  "rx-vlan-stag-hw-parse",
2462306a36Sopenharmony_ci	[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
2562306a36Sopenharmony_ci	[NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
2662306a36Sopenharmony_ci	[NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
2762306a36Sopenharmony_ci	[NETIF_F_LLTX_BIT] =             "tx-lockless",
2862306a36Sopenharmony_ci	[NETIF_F_NETNS_LOCAL_BIT] =      "netns-local",
2962306a36Sopenharmony_ci	[NETIF_F_GRO_BIT] =              "rx-gro",
3062306a36Sopenharmony_ci	[NETIF_F_GRO_HW_BIT] =           "rx-gro-hw",
3162306a36Sopenharmony_ci	[NETIF_F_LRO_BIT] =              "rx-lro",
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	[NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
3462306a36Sopenharmony_ci	[NETIF_F_GSO_ROBUST_BIT] =       "tx-gso-robust",
3562306a36Sopenharmony_ci	[NETIF_F_TSO_ECN_BIT] =          "tx-tcp-ecn-segmentation",
3662306a36Sopenharmony_ci	[NETIF_F_TSO_MANGLEID_BIT] =	 "tx-tcp-mangleid-segmentation",
3762306a36Sopenharmony_ci	[NETIF_F_TSO6_BIT] =             "tx-tcp6-segmentation",
3862306a36Sopenharmony_ci	[NETIF_F_FSO_BIT] =              "tx-fcoe-segmentation",
3962306a36Sopenharmony_ci	[NETIF_F_GSO_GRE_BIT] =		 "tx-gre-segmentation",
4062306a36Sopenharmony_ci	[NETIF_F_GSO_GRE_CSUM_BIT] =	 "tx-gre-csum-segmentation",
4162306a36Sopenharmony_ci	[NETIF_F_GSO_IPXIP4_BIT] =	 "tx-ipxip4-segmentation",
4262306a36Sopenharmony_ci	[NETIF_F_GSO_IPXIP6_BIT] =	 "tx-ipxip6-segmentation",
4362306a36Sopenharmony_ci	[NETIF_F_GSO_UDP_TUNNEL_BIT] =	 "tx-udp_tnl-segmentation",
4462306a36Sopenharmony_ci	[NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
4562306a36Sopenharmony_ci	[NETIF_F_GSO_PARTIAL_BIT] =	 "tx-gso-partial",
4662306a36Sopenharmony_ci	[NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
4762306a36Sopenharmony_ci	[NETIF_F_GSO_SCTP_BIT] =	 "tx-sctp-segmentation",
4862306a36Sopenharmony_ci	[NETIF_F_GSO_ESP_BIT] =		 "tx-esp-segmentation",
4962306a36Sopenharmony_ci	[NETIF_F_GSO_UDP_L4_BIT] =	 "tx-udp-segmentation",
5062306a36Sopenharmony_ci	[NETIF_F_GSO_FRAGLIST_BIT] =	 "tx-gso-list",
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	[NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc",
5362306a36Sopenharmony_ci	[NETIF_F_SCTP_CRC_BIT] =        "tx-checksum-sctp",
5462306a36Sopenharmony_ci	[NETIF_F_FCOE_MTU_BIT] =         "fcoe-mtu",
5562306a36Sopenharmony_ci	[NETIF_F_NTUPLE_BIT] =           "rx-ntuple-filter",
5662306a36Sopenharmony_ci	[NETIF_F_RXHASH_BIT] =           "rx-hashing",
5762306a36Sopenharmony_ci	[NETIF_F_RXCSUM_BIT] =           "rx-checksum",
5862306a36Sopenharmony_ci	[NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
5962306a36Sopenharmony_ci	[NETIF_F_LOOPBACK_BIT] =         "loopback",
6062306a36Sopenharmony_ci	[NETIF_F_RXFCS_BIT] =            "rx-fcs",
6162306a36Sopenharmony_ci	[NETIF_F_RXALL_BIT] =            "rx-all",
6262306a36Sopenharmony_ci	[NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
6362306a36Sopenharmony_ci	[NETIF_F_HW_TC_BIT] =		 "hw-tc-offload",
6462306a36Sopenharmony_ci	[NETIF_F_HW_ESP_BIT] =		 "esp-hw-offload",
6562306a36Sopenharmony_ci	[NETIF_F_HW_ESP_TX_CSUM_BIT] =	 "esp-tx-csum-hw-offload",
6662306a36Sopenharmony_ci	[NETIF_F_RX_UDP_TUNNEL_PORT_BIT] =	 "rx-udp_tunnel-port-offload",
6762306a36Sopenharmony_ci	[NETIF_F_HW_TLS_RECORD_BIT] =	"tls-hw-record",
6862306a36Sopenharmony_ci	[NETIF_F_HW_TLS_TX_BIT] =	 "tls-hw-tx-offload",
6962306a36Sopenharmony_ci	[NETIF_F_HW_TLS_RX_BIT] =	 "tls-hw-rx-offload",
7062306a36Sopenharmony_ci	[NETIF_F_GRO_FRAGLIST_BIT] =	 "rx-gro-list",
7162306a36Sopenharmony_ci	[NETIF_F_HW_MACSEC_BIT] =	 "macsec-hw-offload",
7262306a36Sopenharmony_ci	[NETIF_F_GRO_UDP_FWD_BIT] =	 "rx-udp-gro-forwarding",
7362306a36Sopenharmony_ci	[NETIF_F_HW_HSR_TAG_INS_BIT] =	 "hsr-tag-ins-offload",
7462306a36Sopenharmony_ci	[NETIF_F_HW_HSR_TAG_RM_BIT] =	 "hsr-tag-rm-offload",
7562306a36Sopenharmony_ci	[NETIF_F_HW_HSR_FWD_BIT] =	 "hsr-fwd-offload",
7662306a36Sopenharmony_ci	[NETIF_F_HW_HSR_DUP_BIT] =	 "hsr-dup-offload",
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ciconst char
8062306a36Sopenharmony_cirss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
8162306a36Sopenharmony_ci	[ETH_RSS_HASH_TOP_BIT] =	"toeplitz",
8262306a36Sopenharmony_ci	[ETH_RSS_HASH_XOR_BIT] =	"xor",
8362306a36Sopenharmony_ci	[ETH_RSS_HASH_CRC32_BIT] =	"crc32",
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciconst char
8762306a36Sopenharmony_citunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
8862306a36Sopenharmony_ci	[ETHTOOL_ID_UNSPEC]     = "Unspec",
8962306a36Sopenharmony_ci	[ETHTOOL_RX_COPYBREAK]	= "rx-copybreak",
9062306a36Sopenharmony_ci	[ETHTOOL_TX_COPYBREAK]	= "tx-copybreak",
9162306a36Sopenharmony_ci	[ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
9262306a36Sopenharmony_ci	[ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size",
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ciconst char
9662306a36Sopenharmony_ciphy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
9762306a36Sopenharmony_ci	[ETHTOOL_ID_UNSPEC]     = "Unspec",
9862306a36Sopenharmony_ci	[ETHTOOL_PHY_DOWNSHIFT]	= "phy-downshift",
9962306a36Sopenharmony_ci	[ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
10062306a36Sopenharmony_ci	[ETHTOOL_PHY_EDPD]	= "phy-energy-detect-power-down",
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#define __LINK_MODE_NAME(speed, type, duplex) \
10462306a36Sopenharmony_ci	#speed "base" #type "/" #duplex
10562306a36Sopenharmony_ci#define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
10662306a36Sopenharmony_ci	[ETHTOOL_LINK_MODE(speed, type, duplex)] = \
10762306a36Sopenharmony_ci	__LINK_MODE_NAME(speed, type, duplex)
10862306a36Sopenharmony_ci#define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
10962306a36Sopenharmony_ci	[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ciconst char link_mode_names[][ETH_GSTRING_LEN] = {
11262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10, T, Half),
11362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10, T, Full),
11462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100, T, Half),
11562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100, T, Full),
11662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(1000, T, Half),
11762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(1000, T, Full),
11862306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
11962306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
12062306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
12162306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
12262306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
12362306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
12462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, T, Full),
12562306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
12662306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
12762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(2500, X, Full),
12862306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
12962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(1000, KX, Full),
13062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, KX4, Full),
13162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, KR, Full),
13262306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
13362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
13462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(20000, KR2, Full),
13562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(40000, KR4, Full),
13662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(40000, CR4, Full),
13762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(40000, SR4, Full),
13862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(40000, LR4, Full),
13962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(56000, KR4, Full),
14062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(56000, CR4, Full),
14162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(56000, SR4, Full),
14262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(56000, LR4, Full),
14362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(25000, CR, Full),
14462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(25000, KR, Full),
14562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(25000, SR, Full),
14662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, CR2, Full),
14762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, KR2, Full),
14862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, KR4, Full),
14962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, SR4, Full),
15062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, CR4, Full),
15162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
15262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, SR2, Full),
15362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(1000, X, Full),
15462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, CR, Full),
15562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, SR, Full),
15662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, LR, Full),
15762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, LRM, Full),
15862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10000, ER, Full),
15962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(2500, T, Full),
16062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(5000, T, Full),
16162306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
16262306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
16362306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
16462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, KR, Full),
16562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, SR, Full),
16662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, CR, Full),
16762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
16862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(50000, DR, Full),
16962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, KR2, Full),
17062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, SR2, Full),
17162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, CR2, Full),
17262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
17362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, DR2, Full),
17462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, KR4, Full),
17562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, SR4, Full),
17662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
17762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, DR4, Full),
17862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, CR4, Full),
17962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100, T1, Full),
18062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(1000, T1, Full),
18162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, KR8, Full),
18262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, SR8, Full),
18362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
18462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, DR8, Full),
18562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, CR8, Full),
18662306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
18762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, KR, Full),
18862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, SR, Full),
18962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
19062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, DR, Full),
19162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100000, CR, Full),
19262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, KR2, Full),
19362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, SR2, Full),
19462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
19562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, DR2, Full),
19662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(200000, CR2, Full),
19762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, KR4, Full),
19862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, SR4, Full),
19962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
20062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, DR4, Full),
20162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(400000, CR4, Full),
20262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100, FX, Half),
20362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(100, FX, Full),
20462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10, T1L, Full),
20562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(800000, CR8, Full),
20662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(800000, KR8, Full),
20762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(800000, DR8, Full),
20862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(800000, DR8_2, Full),
20962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(800000, SR8, Full),
21062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(800000, VR8, Full),
21162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10, T1S, Full),
21262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10, T1S, Half),
21362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_NAME(10, T1S_P2MP, Half),
21462306a36Sopenharmony_ci};
21562306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci#define __LINK_MODE_LANES_CR		1
21862306a36Sopenharmony_ci#define __LINK_MODE_LANES_CR2		2
21962306a36Sopenharmony_ci#define __LINK_MODE_LANES_CR4		4
22062306a36Sopenharmony_ci#define __LINK_MODE_LANES_CR8		8
22162306a36Sopenharmony_ci#define __LINK_MODE_LANES_DR		1
22262306a36Sopenharmony_ci#define __LINK_MODE_LANES_DR2		2
22362306a36Sopenharmony_ci#define __LINK_MODE_LANES_DR4		4
22462306a36Sopenharmony_ci#define __LINK_MODE_LANES_DR8		8
22562306a36Sopenharmony_ci#define __LINK_MODE_LANES_KR		1
22662306a36Sopenharmony_ci#define __LINK_MODE_LANES_KR2		2
22762306a36Sopenharmony_ci#define __LINK_MODE_LANES_KR4		4
22862306a36Sopenharmony_ci#define __LINK_MODE_LANES_KR8		8
22962306a36Sopenharmony_ci#define __LINK_MODE_LANES_SR		1
23062306a36Sopenharmony_ci#define __LINK_MODE_LANES_SR2		2
23162306a36Sopenharmony_ci#define __LINK_MODE_LANES_SR4		4
23262306a36Sopenharmony_ci#define __LINK_MODE_LANES_SR8		8
23362306a36Sopenharmony_ci#define __LINK_MODE_LANES_ER		1
23462306a36Sopenharmony_ci#define __LINK_MODE_LANES_KX		1
23562306a36Sopenharmony_ci#define __LINK_MODE_LANES_KX4		4
23662306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR		1
23762306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR4		4
23862306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR4_ER4	4
23962306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR_ER_FR	1
24062306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR2_ER2_FR2	2
24162306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR4_ER4_FR4	4
24262306a36Sopenharmony_ci#define __LINK_MODE_LANES_LR8_ER8_FR8	8
24362306a36Sopenharmony_ci#define __LINK_MODE_LANES_LRM		1
24462306a36Sopenharmony_ci#define __LINK_MODE_LANES_MLD2		2
24562306a36Sopenharmony_ci#define __LINK_MODE_LANES_T		1
24662306a36Sopenharmony_ci#define __LINK_MODE_LANES_T1		1
24762306a36Sopenharmony_ci#define __LINK_MODE_LANES_X		1
24862306a36Sopenharmony_ci#define __LINK_MODE_LANES_FX		1
24962306a36Sopenharmony_ci#define __LINK_MODE_LANES_T1L		1
25062306a36Sopenharmony_ci#define __LINK_MODE_LANES_T1S		1
25162306a36Sopenharmony_ci#define __LINK_MODE_LANES_T1S_P2MP	1
25262306a36Sopenharmony_ci#define __LINK_MODE_LANES_VR8		8
25362306a36Sopenharmony_ci#define __LINK_MODE_LANES_DR8_2		8
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci#define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex)	\
25662306a36Sopenharmony_ci	[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {		\
25762306a36Sopenharmony_ci		.speed  = SPEED_ ## _speed, \
25862306a36Sopenharmony_ci		.lanes  = __LINK_MODE_LANES_ ## _type, \
25962306a36Sopenharmony_ci		.duplex	= __DUPLEX_ ## _duplex \
26062306a36Sopenharmony_ci	}
26162306a36Sopenharmony_ci#define __DUPLEX_Half DUPLEX_HALF
26262306a36Sopenharmony_ci#define __DUPLEX_Full DUPLEX_FULL
26362306a36Sopenharmony_ci#define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
26462306a36Sopenharmony_ci	[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
26562306a36Sopenharmony_ci		.speed	= SPEED_UNKNOWN, \
26662306a36Sopenharmony_ci		.lanes	= 0, \
26762306a36Sopenharmony_ci		.duplex	= DUPLEX_UNKNOWN, \
26862306a36Sopenharmony_ci	}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ciconst struct link_mode_info link_mode_params[] = {
27162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10, T, Half),
27262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10, T, Full),
27362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100, T, Half),
27462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100, T, Full),
27562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(1000, T, Half),
27662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(1000, T, Full),
27762306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
27862306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(TP),
27962306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(AUI),
28062306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(MII),
28162306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
28262306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(BNC),
28362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, T, Full),
28462306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(Pause),
28562306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
28662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(2500, X, Full),
28762306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(Backplane),
28862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(1000, KX, Full),
28962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, KX4, Full),
29062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, KR, Full),
29162306a36Sopenharmony_ci	[ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
29262306a36Sopenharmony_ci		.speed	= SPEED_10000,
29362306a36Sopenharmony_ci		.lanes	= 1,
29462306a36Sopenharmony_ci		.duplex = DUPLEX_FULL,
29562306a36Sopenharmony_ci	},
29662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full),
29762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(20000, KR2, Full),
29862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(40000, KR4, Full),
29962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(40000, CR4, Full),
30062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(40000, SR4, Full),
30162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(40000, LR4, Full),
30262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(56000, KR4, Full),
30362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(56000, CR4, Full),
30462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(56000, SR4, Full),
30562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(56000, LR4, Full),
30662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(25000, CR, Full),
30762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(25000, KR, Full),
30862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(25000, SR, Full),
30962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, CR2, Full),
31062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, KR2, Full),
31162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, KR4, Full),
31262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, SR4, Full),
31362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, CR4, Full),
31462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, Full),
31562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, SR2, Full),
31662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(1000, X, Full),
31762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, CR, Full),
31862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, SR, Full),
31962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, LR, Full),
32062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, LRM, Full),
32162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10000, ER, Full),
32262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(2500, T, Full),
32362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(5000, T, Full),
32462306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
32562306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
32662306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
32762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, KR, Full),
32862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, SR, Full),
32962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, CR, Full),
33062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, Full),
33162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(50000, DR, Full),
33262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, KR2, Full),
33362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, SR2, Full),
33462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, CR2, Full),
33562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, Full),
33662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, DR2, Full),
33762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, KR4, Full),
33862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, SR4, Full),
33962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, Full),
34062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, DR4, Full),
34162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, CR4, Full),
34262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100, T1, Full),
34362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(1000, T1, Full),
34462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, KR8, Full),
34562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, SR8, Full),
34662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, Full),
34762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, DR8, Full),
34862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, CR8, Full),
34962306a36Sopenharmony_ci	__DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
35062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, KR, Full),
35162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, SR, Full),
35262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, Full),
35362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, DR, Full),
35462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100000, CR, Full),
35562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, KR2, Full),
35662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, SR2, Full),
35762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, Full),
35862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, DR2, Full),
35962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(200000, CR2, Full),
36062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, KR4, Full),
36162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, SR4, Full),
36262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, Full),
36362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, DR4, Full),
36462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(400000, CR4, Full),
36562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100, FX, Half),
36662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(100, FX, Full),
36762306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10, T1L, Full),
36862306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(800000, CR8, Full),
36962306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(800000, KR8, Full),
37062306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(800000, DR8, Full),
37162306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(800000, DR8_2, Full),
37262306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(800000, SR8, Full),
37362306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(800000, VR8, Full),
37462306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10, T1S, Full),
37562306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10, T1S, Half),
37662306a36Sopenharmony_ci	__DEFINE_LINK_MODE_PARAMS(10, T1S_P2MP, Half),
37762306a36Sopenharmony_ci};
37862306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ciconst char netif_msg_class_names[][ETH_GSTRING_LEN] = {
38162306a36Sopenharmony_ci	[NETIF_MSG_DRV_BIT]		= "drv",
38262306a36Sopenharmony_ci	[NETIF_MSG_PROBE_BIT]		= "probe",
38362306a36Sopenharmony_ci	[NETIF_MSG_LINK_BIT]		= "link",
38462306a36Sopenharmony_ci	[NETIF_MSG_TIMER_BIT]		= "timer",
38562306a36Sopenharmony_ci	[NETIF_MSG_IFDOWN_BIT]		= "ifdown",
38662306a36Sopenharmony_ci	[NETIF_MSG_IFUP_BIT]		= "ifup",
38762306a36Sopenharmony_ci	[NETIF_MSG_RX_ERR_BIT]		= "rx_err",
38862306a36Sopenharmony_ci	[NETIF_MSG_TX_ERR_BIT]		= "tx_err",
38962306a36Sopenharmony_ci	[NETIF_MSG_TX_QUEUED_BIT]	= "tx_queued",
39062306a36Sopenharmony_ci	[NETIF_MSG_INTR_BIT]		= "intr",
39162306a36Sopenharmony_ci	[NETIF_MSG_TX_DONE_BIT]		= "tx_done",
39262306a36Sopenharmony_ci	[NETIF_MSG_RX_STATUS_BIT]	= "rx_status",
39362306a36Sopenharmony_ci	[NETIF_MSG_PKTDATA_BIT]		= "pktdata",
39462306a36Sopenharmony_ci	[NETIF_MSG_HW_BIT]		= "hw",
39562306a36Sopenharmony_ci	[NETIF_MSG_WOL_BIT]		= "wol",
39662306a36Sopenharmony_ci};
39762306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ciconst char wol_mode_names[][ETH_GSTRING_LEN] = {
40062306a36Sopenharmony_ci	[const_ilog2(WAKE_PHY)]		= "phy",
40162306a36Sopenharmony_ci	[const_ilog2(WAKE_UCAST)]	= "ucast",
40262306a36Sopenharmony_ci	[const_ilog2(WAKE_MCAST)]	= "mcast",
40362306a36Sopenharmony_ci	[const_ilog2(WAKE_BCAST)]	= "bcast",
40462306a36Sopenharmony_ci	[const_ilog2(WAKE_ARP)]		= "arp",
40562306a36Sopenharmony_ci	[const_ilog2(WAKE_MAGIC)]	= "magic",
40662306a36Sopenharmony_ci	[const_ilog2(WAKE_MAGICSECURE)]	= "magicsecure",
40762306a36Sopenharmony_ci	[const_ilog2(WAKE_FILTER)]	= "filter",
40862306a36Sopenharmony_ci};
40962306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ciconst char sof_timestamping_names[][ETH_GSTRING_LEN] = {
41262306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)]  = "hardware-transmit",
41362306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)]  = "software-transmit",
41462306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)]  = "hardware-receive",
41562306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)]  = "software-receive",
41662306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_SOFTWARE)]     = "software-system-clock",
41762306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
41862306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
41962306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_ID)]       = "option-id",
42062306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_TX_SCHED)]     = "sched-transmit",
42162306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_TX_ACK)]       = "ack-transmit",
42262306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)]     = "option-cmsg",
42362306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)]   = "option-tsonly",
42462306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_STATS)]    = "option-stats",
42562306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)]  = "option-pktinfo",
42662306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)]  = "option-tx-swhw",
42762306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_BIND_PHC)]     = "bind-phc",
42862306a36Sopenharmony_ci	[const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)]   = "option-id-tcp",
42962306a36Sopenharmony_ci};
43062306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ciconst char ts_tx_type_names[][ETH_GSTRING_LEN] = {
43362306a36Sopenharmony_ci	[HWTSTAMP_TX_OFF]		= "off",
43462306a36Sopenharmony_ci	[HWTSTAMP_TX_ON]		= "on",
43562306a36Sopenharmony_ci	[HWTSTAMP_TX_ONESTEP_SYNC]	= "onestep-sync",
43662306a36Sopenharmony_ci	[HWTSTAMP_TX_ONESTEP_P2P]	= "onestep-p2p",
43762306a36Sopenharmony_ci};
43862306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ciconst char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
44162306a36Sopenharmony_ci	[HWTSTAMP_FILTER_NONE]			= "none",
44262306a36Sopenharmony_ci	[HWTSTAMP_FILTER_ALL]			= "all",
44362306a36Sopenharmony_ci	[HWTSTAMP_FILTER_SOME]			= "some",
44462306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V1_L4_EVENT]	= "ptpv1-l4-event",
44562306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V1_L4_SYNC]	= "ptpv1-l4-sync",
44662306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ]	= "ptpv1-l4-delay-req",
44762306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_L4_EVENT]	= "ptpv2-l4-event",
44862306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_L4_SYNC]	= "ptpv2-l4-sync",
44962306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ]	= "ptpv2-l4-delay-req",
45062306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_L2_EVENT]	= "ptpv2-l2-event",
45162306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_L2_SYNC]	= "ptpv2-l2-sync",
45262306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ]	= "ptpv2-l2-delay-req",
45362306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_EVENT]		= "ptpv2-event",
45462306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_SYNC]		= "ptpv2-sync",
45562306a36Sopenharmony_ci	[HWTSTAMP_FILTER_PTP_V2_DELAY_REQ]	= "ptpv2-delay-req",
45662306a36Sopenharmony_ci	[HWTSTAMP_FILTER_NTP_ALL]		= "ntp-all",
45762306a36Sopenharmony_ci};
45862306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ciconst char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
46162306a36Sopenharmony_ci	[ETHTOOL_UDP_TUNNEL_TYPE_VXLAN]		= "vxlan",
46262306a36Sopenharmony_ci	[ETHTOOL_UDP_TUNNEL_TYPE_GENEVE]	= "geneve",
46362306a36Sopenharmony_ci	[ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE]	= "vxlan-gpe",
46462306a36Sopenharmony_ci};
46562306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
46662306a36Sopenharmony_ci	      __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci/* return false if legacy contained non-0 deprecated fields
46962306a36Sopenharmony_ci * maxtxpkt/maxrxpkt. rest of ksettings always updated
47062306a36Sopenharmony_ci */
47162306a36Sopenharmony_cibool
47262306a36Sopenharmony_ciconvert_legacy_settings_to_link_ksettings(
47362306a36Sopenharmony_ci	struct ethtool_link_ksettings *link_ksettings,
47462306a36Sopenharmony_ci	const struct ethtool_cmd *legacy_settings)
47562306a36Sopenharmony_ci{
47662306a36Sopenharmony_ci	bool retval = true;
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_ci	memset(link_ksettings, 0, sizeof(*link_ksettings));
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci	/* This is used to tell users that driver is still using these
48162306a36Sopenharmony_ci	 * deprecated legacy fields, and they should not use
48262306a36Sopenharmony_ci	 * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
48362306a36Sopenharmony_ci	 */
48462306a36Sopenharmony_ci	if (legacy_settings->maxtxpkt ||
48562306a36Sopenharmony_ci	    legacy_settings->maxrxpkt)
48662306a36Sopenharmony_ci		retval = false;
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	ethtool_convert_legacy_u32_to_link_mode(
48962306a36Sopenharmony_ci		link_ksettings->link_modes.supported,
49062306a36Sopenharmony_ci		legacy_settings->supported);
49162306a36Sopenharmony_ci	ethtool_convert_legacy_u32_to_link_mode(
49262306a36Sopenharmony_ci		link_ksettings->link_modes.advertising,
49362306a36Sopenharmony_ci		legacy_settings->advertising);
49462306a36Sopenharmony_ci	ethtool_convert_legacy_u32_to_link_mode(
49562306a36Sopenharmony_ci		link_ksettings->link_modes.lp_advertising,
49662306a36Sopenharmony_ci		legacy_settings->lp_advertising);
49762306a36Sopenharmony_ci	link_ksettings->base.speed
49862306a36Sopenharmony_ci		= ethtool_cmd_speed(legacy_settings);
49962306a36Sopenharmony_ci	link_ksettings->base.duplex
50062306a36Sopenharmony_ci		= legacy_settings->duplex;
50162306a36Sopenharmony_ci	link_ksettings->base.port
50262306a36Sopenharmony_ci		= legacy_settings->port;
50362306a36Sopenharmony_ci	link_ksettings->base.phy_address
50462306a36Sopenharmony_ci		= legacy_settings->phy_address;
50562306a36Sopenharmony_ci	link_ksettings->base.autoneg
50662306a36Sopenharmony_ci		= legacy_settings->autoneg;
50762306a36Sopenharmony_ci	link_ksettings->base.mdio_support
50862306a36Sopenharmony_ci		= legacy_settings->mdio_support;
50962306a36Sopenharmony_ci	link_ksettings->base.eth_tp_mdix
51062306a36Sopenharmony_ci		= legacy_settings->eth_tp_mdix;
51162306a36Sopenharmony_ci	link_ksettings->base.eth_tp_mdix_ctrl
51262306a36Sopenharmony_ci		= legacy_settings->eth_tp_mdix_ctrl;
51362306a36Sopenharmony_ci	return retval;
51462306a36Sopenharmony_ci}
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ciint __ethtool_get_link(struct net_device *dev)
51762306a36Sopenharmony_ci{
51862306a36Sopenharmony_ci	if (!dev->ethtool_ops->get_link)
51962306a36Sopenharmony_ci		return -EOPNOTSUPP;
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	return netif_running(dev) && dev->ethtool_ops->get_link(dev);
52262306a36Sopenharmony_ci}
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_cistatic int ethtool_get_rxnfc_rule_count(struct net_device *dev)
52562306a36Sopenharmony_ci{
52662306a36Sopenharmony_ci	const struct ethtool_ops *ops = dev->ethtool_ops;
52762306a36Sopenharmony_ci	struct ethtool_rxnfc info = {
52862306a36Sopenharmony_ci		.cmd = ETHTOOL_GRXCLSRLCNT,
52962306a36Sopenharmony_ci	};
53062306a36Sopenharmony_ci	int err;
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci	err = ops->get_rxnfc(dev, &info, NULL);
53362306a36Sopenharmony_ci	if (err)
53462306a36Sopenharmony_ci		return err;
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	return info.rule_cnt;
53762306a36Sopenharmony_ci}
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ciint ethtool_get_max_rxnfc_channel(struct net_device *dev, u64 *max)
54062306a36Sopenharmony_ci{
54162306a36Sopenharmony_ci	const struct ethtool_ops *ops = dev->ethtool_ops;
54262306a36Sopenharmony_ci	struct ethtool_rxnfc *info;
54362306a36Sopenharmony_ci	int err, i, rule_cnt;
54462306a36Sopenharmony_ci	u64 max_ring = 0;
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	if (!ops->get_rxnfc)
54762306a36Sopenharmony_ci		return -EOPNOTSUPP;
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_ci	rule_cnt = ethtool_get_rxnfc_rule_count(dev);
55062306a36Sopenharmony_ci	if (rule_cnt <= 0)
55162306a36Sopenharmony_ci		return -EINVAL;
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	info = kvzalloc(struct_size(info, rule_locs, rule_cnt), GFP_KERNEL);
55462306a36Sopenharmony_ci	if (!info)
55562306a36Sopenharmony_ci		return -ENOMEM;
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci	info->cmd = ETHTOOL_GRXCLSRLALL;
55862306a36Sopenharmony_ci	info->rule_cnt = rule_cnt;
55962306a36Sopenharmony_ci	err = ops->get_rxnfc(dev, info, info->rule_locs);
56062306a36Sopenharmony_ci	if (err)
56162306a36Sopenharmony_ci		goto err_free_info;
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci	for (i = 0; i < rule_cnt; i++) {
56462306a36Sopenharmony_ci		struct ethtool_rxnfc rule_info = {
56562306a36Sopenharmony_ci			.cmd = ETHTOOL_GRXCLSRULE,
56662306a36Sopenharmony_ci			.fs.location = info->rule_locs[i],
56762306a36Sopenharmony_ci		};
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci		err = ops->get_rxnfc(dev, &rule_info, NULL);
57062306a36Sopenharmony_ci		if (err)
57162306a36Sopenharmony_ci			goto err_free_info;
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci		if (rule_info.fs.ring_cookie != RX_CLS_FLOW_DISC &&
57462306a36Sopenharmony_ci		    rule_info.fs.ring_cookie != RX_CLS_FLOW_WAKE &&
57562306a36Sopenharmony_ci		    !(rule_info.flow_type & FLOW_RSS) &&
57662306a36Sopenharmony_ci		    !ethtool_get_flow_spec_ring_vf(rule_info.fs.ring_cookie))
57762306a36Sopenharmony_ci			max_ring =
57862306a36Sopenharmony_ci				max_t(u64, max_ring, rule_info.fs.ring_cookie);
57962306a36Sopenharmony_ci	}
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci	kvfree(info);
58262306a36Sopenharmony_ci	*max = max_ring;
58362306a36Sopenharmony_ci	return 0;
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_cierr_free_info:
58662306a36Sopenharmony_ci	kvfree(info);
58762306a36Sopenharmony_ci	return err;
58862306a36Sopenharmony_ci}
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ciint ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max)
59162306a36Sopenharmony_ci{
59262306a36Sopenharmony_ci	u32 dev_size, current_max = 0;
59362306a36Sopenharmony_ci	u32 *indir;
59462306a36Sopenharmony_ci	int ret;
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	if (!dev->ethtool_ops->get_rxfh_indir_size ||
59762306a36Sopenharmony_ci	    !dev->ethtool_ops->get_rxfh)
59862306a36Sopenharmony_ci		return -EOPNOTSUPP;
59962306a36Sopenharmony_ci	dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
60062306a36Sopenharmony_ci	if (dev_size == 0)
60162306a36Sopenharmony_ci		return -EOPNOTSUPP;
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci	indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
60462306a36Sopenharmony_ci	if (!indir)
60562306a36Sopenharmony_ci		return -ENOMEM;
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL);
60862306a36Sopenharmony_ci	if (ret)
60962306a36Sopenharmony_ci		goto out;
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	while (dev_size--)
61262306a36Sopenharmony_ci		current_max = max(current_max, indir[dev_size]);
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	*max = current_max;
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ciout:
61762306a36Sopenharmony_ci	kfree(indir);
61862306a36Sopenharmony_ci	return ret;
61962306a36Sopenharmony_ci}
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ciint ethtool_check_ops(const struct ethtool_ops *ops)
62262306a36Sopenharmony_ci{
62362306a36Sopenharmony_ci	if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
62462306a36Sopenharmony_ci		return -EINVAL;
62562306a36Sopenharmony_ci	/* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
62662306a36Sopenharmony_ci	 * the fact that ops are checked at registration time does not
62762306a36Sopenharmony_ci	 * mean the ops attached to a netdev later on are sane.
62862306a36Sopenharmony_ci	 */
62962306a36Sopenharmony_ci	return 0;
63062306a36Sopenharmony_ci}
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ciint __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
63362306a36Sopenharmony_ci{
63462306a36Sopenharmony_ci	const struct ethtool_ops *ops = dev->ethtool_ops;
63562306a36Sopenharmony_ci	struct phy_device *phydev = dev->phydev;
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ci	memset(info, 0, sizeof(*info));
63862306a36Sopenharmony_ci	info->cmd = ETHTOOL_GET_TS_INFO;
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci	if (phy_has_tsinfo(phydev))
64162306a36Sopenharmony_ci		return phy_ts_info(phydev, info);
64262306a36Sopenharmony_ci	if (ops->get_ts_info)
64362306a36Sopenharmony_ci		return ops->get_ts_info(dev, info);
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci	info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
64662306a36Sopenharmony_ci				SOF_TIMESTAMPING_SOFTWARE;
64762306a36Sopenharmony_ci	info->phc_index = -1;
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	return 0;
65062306a36Sopenharmony_ci}
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ciint ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index)
65362306a36Sopenharmony_ci{
65462306a36Sopenharmony_ci	struct ethtool_ts_info info = { };
65562306a36Sopenharmony_ci	int num = 0;
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	if (!__ethtool_get_ts_info(dev, &info))
65862306a36Sopenharmony_ci		num = ptp_get_vclocks_index(info.phc_index, vclock_index);
65962306a36Sopenharmony_ci
66062306a36Sopenharmony_ci	return num;
66162306a36Sopenharmony_ci}
66262306a36Sopenharmony_ciEXPORT_SYMBOL(ethtool_get_phc_vclocks);
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ciconst struct ethtool_phy_ops *ethtool_phy_ops;
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_civoid ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
66762306a36Sopenharmony_ci{
66862306a36Sopenharmony_ci	ASSERT_RTNL();
66962306a36Sopenharmony_ci	ethtool_phy_ops = ops;
67062306a36Sopenharmony_ci}
67162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_civoid
67462306a36Sopenharmony_ciethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
67562306a36Sopenharmony_ci			      enum ethtool_link_mode_bit_indices link_mode)
67662306a36Sopenharmony_ci{
67762306a36Sopenharmony_ci	const struct link_mode_info *link_info;
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	if (WARN_ON_ONCE(link_mode >= __ETHTOOL_LINK_MODE_MASK_NBITS))
68062306a36Sopenharmony_ci		return;
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	link_info = &link_mode_params[link_mode];
68362306a36Sopenharmony_ci	link_ksettings->base.speed = link_info->speed;
68462306a36Sopenharmony_ci	link_ksettings->lanes = link_info->lanes;
68562306a36Sopenharmony_ci	link_ksettings->base.duplex = link_info->duplex;
68662306a36Sopenharmony_ci}
68762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(ethtool_params_from_link_mode);
688