File Index
Files and directories
Sign in
FILE

common.c

File preview with syntax highlighting.

linux-6.19.14/net/ethtool/common.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2
   3#include <linux/ethtool_netlink.h>
   4#include <linux/net_tstamp.h>
   5#include <linux/phy.h>
   6#include <linux/rtnetlink.h>
   7#include <linux/ptp_clock_kernel.h>
   8#include <linux/phy_link_topology.h>
   9#include <net/netdev_queues.h>
  10
  11#include "netlink.h"
  12#include "common.h"
  13#include "../core/dev.h"
  14
  15
  16const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
  17	[NETIF_F_SG_BIT] =               "tx-scatter-gather",
  18	[NETIF_F_IP_CSUM_BIT] =          "tx-checksum-ipv4",
  19	[NETIF_F_HW_CSUM_BIT] =          "tx-checksum-ip-generic",
  20	[NETIF_F_IPV6_CSUM_BIT] =        "tx-checksum-ipv6",
  21	[NETIF_F_HIGHDMA_BIT] =          "highdma",
  22	[NETIF_F_FRAGLIST_BIT] =         "tx-scatter-gather-fraglist",
  23	[NETIF_F_HW_VLAN_CTAG_TX_BIT] =  "tx-vlan-hw-insert",
  24
  25	[NETIF_F_HW_VLAN_CTAG_RX_BIT] =  "rx-vlan-hw-parse",
  26	[NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
  27	[NETIF_F_HW_VLAN_STAG_TX_BIT] =  "tx-vlan-stag-hw-insert",
  28	[NETIF_F_HW_VLAN_STAG_RX_BIT] =  "rx-vlan-stag-hw-parse",
  29	[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
  30	[NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
  31	[NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
  32	[NETIF_F_GRO_BIT] =              "rx-gro",
  33	[NETIF_F_GRO_HW_BIT] =           "rx-gro-hw",
  34	[NETIF_F_LRO_BIT] =              "rx-lro",
  35
  36	[NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
  37	[NETIF_F_GSO_ROBUST_BIT] =       "tx-gso-robust",
  38	[NETIF_F_TSO_ECN_BIT] =          "tx-tcp-ecn-segmentation",
  39	[NETIF_F_GSO_ACCECN_BIT] =	 "tx-tcp-accecn-segmentation",
  40	[NETIF_F_TSO_MANGLEID_BIT] =	 "tx-tcp-mangleid-segmentation",
  41	[NETIF_F_TSO6_BIT] =             "tx-tcp6-segmentation",
  42	[NETIF_F_FSO_BIT] =              "tx-fcoe-segmentation",
  43	[NETIF_F_GSO_GRE_BIT] =		 "tx-gre-segmentation",
  44	[NETIF_F_GSO_GRE_CSUM_BIT] =	 "tx-gre-csum-segmentation",
  45	[NETIF_F_GSO_IPXIP4_BIT] =	 "tx-ipxip4-segmentation",
  46	[NETIF_F_GSO_IPXIP6_BIT] =	 "tx-ipxip6-segmentation",
  47	[NETIF_F_GSO_UDP_TUNNEL_BIT] =	 "tx-udp_tnl-segmentation",
  48	[NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
  49	[NETIF_F_GSO_PARTIAL_BIT] =	 "tx-gso-partial",
  50	[NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
  51	[NETIF_F_GSO_SCTP_BIT] =	 "tx-sctp-segmentation",
  52	[NETIF_F_GSO_ESP_BIT] =		 "tx-esp-segmentation",
  53	[NETIF_F_GSO_UDP_L4_BIT] =	 "tx-udp-segmentation",
  54	[NETIF_F_GSO_FRAGLIST_BIT] =	 "tx-gso-list",
  55
  56	[NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc",
  57	[NETIF_F_SCTP_CRC_BIT] =        "tx-checksum-sctp",
  58	[NETIF_F_NTUPLE_BIT] =           "rx-ntuple-filter",
  59	[NETIF_F_RXHASH_BIT] =           "rx-hashing",
  60	[NETIF_F_RXCSUM_BIT] =           "rx-checksum",
  61	[NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
  62	[NETIF_F_LOOPBACK_BIT] =         "loopback",
  63	[NETIF_F_RXFCS_BIT] =            "rx-fcs",
  64	[NETIF_F_RXALL_BIT] =            "rx-all",
  65	[NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
  66	[NETIF_F_HW_TC_BIT] =		 "hw-tc-offload",
  67	[NETIF_F_HW_ESP_BIT] =		 "esp-hw-offload",
  68	[NETIF_F_HW_ESP_TX_CSUM_BIT] =	 "esp-tx-csum-hw-offload",
  69	[NETIF_F_RX_UDP_TUNNEL_PORT_BIT] =	 "rx-udp_tunnel-port-offload",
  70	[NETIF_F_HW_TLS_RECORD_BIT] =	"tls-hw-record",
  71	[NETIF_F_HW_TLS_TX_BIT] =	 "tls-hw-tx-offload",
  72	[NETIF_F_HW_TLS_RX_BIT] =	 "tls-hw-rx-offload",
  73	[NETIF_F_GRO_FRAGLIST_BIT] =	 "rx-gro-list",
  74	[NETIF_F_HW_MACSEC_BIT] =	 "macsec-hw-offload",
  75	[NETIF_F_GRO_UDP_FWD_BIT] =	 "rx-udp-gro-forwarding",
  76	[NETIF_F_HW_HSR_TAG_INS_BIT] =	 "hsr-tag-ins-offload",
  77	[NETIF_F_HW_HSR_TAG_RM_BIT] =	 "hsr-tag-rm-offload",
  78	[NETIF_F_HW_HSR_FWD_BIT] =	 "hsr-fwd-offload",
  79	[NETIF_F_HW_HSR_DUP_BIT] =	 "hsr-dup-offload",
  80};
  81
  82const char
  83rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
  84	[ETH_RSS_HASH_TOP_BIT] =	"toeplitz",
  85	[ETH_RSS_HASH_XOR_BIT] =	"xor",
  86	[ETH_RSS_HASH_CRC32_BIT] =	"crc32",
  87};
  88
  89const char
  90tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
  91	[ETHTOOL_ID_UNSPEC]     = "Unspec",
  92	[ETHTOOL_RX_COPYBREAK]	= "rx-copybreak",
  93	[ETHTOOL_TX_COPYBREAK]	= "tx-copybreak",
  94	[ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
  95	[ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size",
  96};
  97
  98const char
  99phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
 100	[ETHTOOL_ID_UNSPEC]     = "Unspec",
 101	[ETHTOOL_PHY_DOWNSHIFT]	= "phy-downshift",
 102	[ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
 103	[ETHTOOL_PHY_EDPD]	= "phy-energy-detect-power-down",
 104};
 105
 106#define __LINK_MODE_NAME(speed, type, duplex) \
 107	#speed "base" #type "/" #duplex
 108#define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
 109	[ETHTOOL_LINK_MODE(speed, type, duplex)] = \
 110	__LINK_MODE_NAME(speed, type, duplex)
 111#define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
 112	[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
 113
 114const char link_mode_names[][ETH_GSTRING_LEN] = {
 115	__DEFINE_LINK_MODE_NAME(10, T, Half),
 116	__DEFINE_LINK_MODE_NAME(10, T, Full),
 117	__DEFINE_LINK_MODE_NAME(100, T, Half),
 118	__DEFINE_LINK_MODE_NAME(100, T, Full),
 119	__DEFINE_LINK_MODE_NAME(1000, T, Half),
 120	__DEFINE_LINK_MODE_NAME(1000, T, Full),
 121	__DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
 122	__DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
 123	__DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
 124	__DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
 125	__DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
 126	__DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
 127	__DEFINE_LINK_MODE_NAME(10000, T, Full),
 128	__DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
 129	__DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
 130	__DEFINE_LINK_MODE_NAME(2500, X, Full),
 131	__DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
 132	__DEFINE_LINK_MODE_NAME(1000, KX, Full),
 133	__DEFINE_LINK_MODE_NAME(10000, KX4, Full),
 134	__DEFINE_LINK_MODE_NAME(10000, KR, Full),
 135	__DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
 136	__DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
 137	__DEFINE_LINK_MODE_NAME(20000, KR2, Full),
 138	__DEFINE_LINK_MODE_NAME(40000, KR4, Full),
 139	__DEFINE_LINK_MODE_NAME(40000, CR4, Full),
 140	__DEFINE_LINK_MODE_NAME(40000, SR4, Full),
 141	__DEFINE_LINK_MODE_NAME(40000, LR4, Full),
 142	__DEFINE_LINK_MODE_NAME(56000, KR4, Full),
 143	__DEFINE_LINK_MODE_NAME(56000, CR4, Full),
 144	__DEFINE_LINK_MODE_NAME(56000, SR4, Full),
 145	__DEFINE_LINK_MODE_NAME(56000, LR4, Full),
 146	__DEFINE_LINK_MODE_NAME(25000, CR, Full),
 147	__DEFINE_LINK_MODE_NAME(25000, KR, Full),
 148	__DEFINE_LINK_MODE_NAME(25000, SR, Full),
 149	__DEFINE_LINK_MODE_NAME(50000, CR2, Full),
 150	__DEFINE_LINK_MODE_NAME(50000, KR2, Full),
 151	__DEFINE_LINK_MODE_NAME(100000, KR4, Full),
 152	__DEFINE_LINK_MODE_NAME(100000, SR4, Full),
 153	__DEFINE_LINK_MODE_NAME(100000, CR4, Full),
 154	__DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
 155	__DEFINE_LINK_MODE_NAME(50000, SR2, Full),
 156	__DEFINE_LINK_MODE_NAME(1000, X, Full),
 157	__DEFINE_LINK_MODE_NAME(10000, CR, Full),
 158	__DEFINE_LINK_MODE_NAME(10000, SR, Full),
 159	__DEFINE_LINK_MODE_NAME(10000, LR, Full),
 160	__DEFINE_LINK_MODE_NAME(10000, LRM, Full),
 161	__DEFINE_LINK_MODE_NAME(10000, ER, Full),
 162	__DEFINE_LINK_MODE_NAME(2500, T, Full),
 163	__DEFINE_LINK_MODE_NAME(5000, T, Full),
 164	__DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
 165	__DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
 166	__DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
 167	__DEFINE_LINK_MODE_NAME(50000, KR, Full),
 168	__DEFINE_LINK_MODE_NAME(50000, SR, Full),
 169	__DEFINE_LINK_MODE_NAME(50000, CR, Full),
 170	__DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
 171	__DEFINE_LINK_MODE_NAME(50000, DR, Full),
 172	__DEFINE_LINK_MODE_NAME(100000, KR2, Full),
 173	__DEFINE_LINK_MODE_NAME(100000, SR2, Full),
 174	__DEFINE_LINK_MODE_NAME(100000, CR2, Full),
 175	__DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
 176	__DEFINE_LINK_MODE_NAME(100000, DR2, Full),
 177	__DEFINE_LINK_MODE_NAME(200000, KR4, Full),
 178	__DEFINE_LINK_MODE_NAME(200000, SR4, Full),
 179	__DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
 180	__DEFINE_LINK_MODE_NAME(200000, DR4, Full),
 181	__DEFINE_LINK_MODE_NAME(200000, CR4, Full),
 182	__DEFINE_LINK_MODE_NAME(100, T1, Full),
 183	__DEFINE_LINK_MODE_NAME(1000, T1, Full),
 184	__DEFINE_LINK_MODE_NAME(400000, KR8, Full),
 185	__DEFINE_LINK_MODE_NAME(400000, SR8, Full),
 186	__DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
 187	__DEFINE_LINK_MODE_NAME(400000, DR8, Full),
 188	__DEFINE_LINK_MODE_NAME(400000, CR8, Full),
 189	__DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
 190	__DEFINE_LINK_MODE_NAME(100000, KR, Full),
 191	__DEFINE_LINK_MODE_NAME(100000, SR, Full),
 192	__DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
 193	__DEFINE_LINK_MODE_NAME(100000, DR, Full),
 194	__DEFINE_LINK_MODE_NAME(100000, CR, Full),
 195	__DEFINE_LINK_MODE_NAME(200000, KR2, Full),
 196	__DEFINE_LINK_MODE_NAME(200000, SR2, Full),
 197	__DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
 198	__DEFINE_LINK_MODE_NAME(200000, DR2, Full),
 199	__DEFINE_LINK_MODE_NAME(200000, CR2, Full),
 200	__DEFINE_LINK_MODE_NAME(400000, KR4, Full),
 201	__DEFINE_LINK_MODE_NAME(400000, SR4, Full),
 202	__DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
 203	__DEFINE_LINK_MODE_NAME(400000, DR4, Full),
 204	__DEFINE_LINK_MODE_NAME(400000, CR4, Full),
 205	__DEFINE_LINK_MODE_NAME(100, FX, Half),
 206	__DEFINE_LINK_MODE_NAME(100, FX, Full),
 207	__DEFINE_LINK_MODE_NAME(10, T1L, Full),
 208	__DEFINE_LINK_MODE_NAME(800000, CR8, Full),
 209	__DEFINE_LINK_MODE_NAME(800000, KR8, Full),
 210	__DEFINE_LINK_MODE_NAME(800000, DR8, Full),
 211	__DEFINE_LINK_MODE_NAME(800000, DR8_2, Full),
 212	__DEFINE_LINK_MODE_NAME(800000, SR8, Full),
 213	__DEFINE_LINK_MODE_NAME(800000, VR8, Full),
 214	__DEFINE_LINK_MODE_NAME(10, T1S, Full),
 215	__DEFINE_LINK_MODE_NAME(10, T1S, Half),
 216	__DEFINE_LINK_MODE_NAME(10, T1S_P2MP, Half),
 217	__DEFINE_LINK_MODE_NAME(10, T1BRR, Full),
 218	__DEFINE_LINK_MODE_NAME(200000, CR, Full),
 219	__DEFINE_LINK_MODE_NAME(200000, KR, Full),
 220	__DEFINE_LINK_MODE_NAME(200000, DR, Full),
 221	__DEFINE_LINK_MODE_NAME(200000, DR_2, Full),
 222	__DEFINE_LINK_MODE_NAME(200000, SR, Full),
 223	__DEFINE_LINK_MODE_NAME(200000, VR, Full),
 224	__DEFINE_LINK_MODE_NAME(400000, CR2, Full),
 225	__DEFINE_LINK_MODE_NAME(400000, KR2, Full),
 226	__DEFINE_LINK_MODE_NAME(400000, DR2, Full),
 227	__DEFINE_LINK_MODE_NAME(400000, DR2_2, Full),
 228	__DEFINE_LINK_MODE_NAME(400000, SR2, Full),
 229	__DEFINE_LINK_MODE_NAME(400000, VR2, Full),
 230	__DEFINE_LINK_MODE_NAME(800000, CR4, Full),
 231	__DEFINE_LINK_MODE_NAME(800000, KR4, Full),
 232	__DEFINE_LINK_MODE_NAME(800000, DR4, Full),
 233	__DEFINE_LINK_MODE_NAME(800000, DR4_2, Full),
 234	__DEFINE_LINK_MODE_NAME(800000, SR4, Full),
 235	__DEFINE_LINK_MODE_NAME(800000, VR4, Full),
 236	__DEFINE_LINK_MODE_NAME(1600000, CR8, Full),
 237	__DEFINE_LINK_MODE_NAME(1600000, KR8, Full),
 238	__DEFINE_LINK_MODE_NAME(1600000, DR8, Full),
 239	__DEFINE_LINK_MODE_NAME(1600000, DR8_2, Full),
 240};
 241static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
 242
 243#define __LINK_MODE_LANES_CR		1
 244#define __LINK_MODE_LANES_CR2		2
 245#define __LINK_MODE_LANES_CR4		4
 246#define __LINK_MODE_LANES_CR8		8
 247#define __LINK_MODE_LANES_DR		1
 248#define __LINK_MODE_LANES_DR_2		1
 249#define __LINK_MODE_LANES_DR2		2
 250#define __LINK_MODE_LANES_DR2_2		2
 251#define __LINK_MODE_LANES_DR4		4
 252#define __LINK_MODE_LANES_DR4_2		4
 253#define __LINK_MODE_LANES_DR8		8
 254#define __LINK_MODE_LANES_KR		1
 255#define __LINK_MODE_LANES_KR2		2
 256#define __LINK_MODE_LANES_KR4		4
 257#define __LINK_MODE_LANES_KR8		8
 258#define __LINK_MODE_LANES_SR		1
 259#define __LINK_MODE_LANES_SR2		2
 260#define __LINK_MODE_LANES_SR4		4
 261#define __LINK_MODE_LANES_SR8		8
 262#define __LINK_MODE_LANES_ER		1
 263#define __LINK_MODE_LANES_KX		1
 264#define __LINK_MODE_LANES_KX4		4
 265#define __LINK_MODE_LANES_LR		1
 266#define __LINK_MODE_LANES_LR4		4
 267#define __LINK_MODE_LANES_LR4_ER4	4
 268#define __LINK_MODE_LANES_LR_ER_FR	1
 269#define __LINK_MODE_LANES_LR2_ER2_FR2	2
 270#define __LINK_MODE_LANES_LR4_ER4_FR4	4
 271#define __LINK_MODE_LANES_LR8_ER8_FR8	8
 272#define __LINK_MODE_LANES_LRM		1
 273#define __LINK_MODE_LANES_MLD2		2
 274#define __LINK_MODE_LANES_T		1
 275#define __LINK_MODE_LANES_T1		1
 276#define __LINK_MODE_LANES_X		1
 277#define __LINK_MODE_LANES_FX		1
 278#define __LINK_MODE_LANES_T1L		1
 279#define __LINK_MODE_LANES_T1S		1
 280#define __LINK_MODE_LANES_T1S_P2MP	1
 281#define __LINK_MODE_LANES_VR		1
 282#define __LINK_MODE_LANES_VR2		2
 283#define __LINK_MODE_LANES_VR4		4
 284#define __LINK_MODE_LANES_VR8		8
 285#define __LINK_MODE_LANES_DR8_2		8
 286#define __LINK_MODE_LANES_T1BRR		1
 287
 288#define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex)	\
 289	[ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {		\
 290		.speed  = SPEED_ ## _speed, \
 291		.lanes  = __LINK_MODE_LANES_ ## _type, \
 292		.duplex	= __DUPLEX_ ## _duplex \
 293	}
 294#define __DUPLEX_Half DUPLEX_HALF
 295#define __DUPLEX_Full DUPLEX_FULL
 296#define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
 297	[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
 298		.speed	= SPEED_UNKNOWN, \
 299		.lanes	= 0, \
 300		.duplex	= DUPLEX_UNKNOWN, \
 301	}
 302
 303const struct link_mode_info link_mode_params[] = {
 304	__DEFINE_LINK_MODE_PARAMS(10, T, Half),
 305	__DEFINE_LINK_MODE_PARAMS(10, T, Full),
 306	__DEFINE_LINK_MODE_PARAMS(100, T, Half),
 307	__DEFINE_LINK_MODE_PARAMS(100, T, Full),
 308	__DEFINE_LINK_MODE_PARAMS(1000, T, Half),
 309	__DEFINE_LINK_MODE_PARAMS(1000, T, Full),
 310	__DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
 311	__DEFINE_SPECIAL_MODE_PARAMS(TP),
 312	__DEFINE_SPECIAL_MODE_PARAMS(AUI),
 313	__DEFINE_SPECIAL_MODE_PARAMS(MII),
 314	__DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
 315	__DEFINE_SPECIAL_MODE_PARAMS(BNC),
 316	__DEFINE_LINK_MODE_PARAMS(10000, T, Full),
 317	__DEFINE_SPECIAL_MODE_PARAMS(Pause),
 318	__DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
 319	__DEFINE_LINK_MODE_PARAMS(2500, X, Full),
 320	__DEFINE_SPECIAL_MODE_PARAMS(Backplane),
 321	__DEFINE_LINK_MODE_PARAMS(1000, KX, Full),
 322	__DEFINE_LINK_MODE_PARAMS(10000, KX4, Full),
 323	__DEFINE_LINK_MODE_PARAMS(10000, KR, Full),
 324	[ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
 325		.speed	= SPEED_10000,
 326		.lanes	= 1,
 327		.duplex = DUPLEX_FULL,
 328	},
 329	__DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full),
 330	__DEFINE_LINK_MODE_PARAMS(20000, KR2, Full),
 331	__DEFINE_LINK_MODE_PARAMS(40000, KR4, Full),
 332	__DEFINE_LINK_MODE_PARAMS(40000, CR4, Full),
 333	__DEFINE_LINK_MODE_PARAMS(40000, SR4, Full),
 334	__DEFINE_LINK_MODE_PARAMS(40000, LR4, Full),
 335	__DEFINE_LINK_MODE_PARAMS(56000, KR4, Full),
 336	__DEFINE_LINK_MODE_PARAMS(56000, CR4, Full),
 337	__DEFINE_LINK_MODE_PARAMS(56000, SR4, Full),
 338	__DEFINE_LINK_MODE_PARAMS(56000, LR4, Full),
 339	__DEFINE_LINK_MODE_PARAMS(25000, CR, Full),
 340	__DEFINE_LINK_MODE_PARAMS(25000, KR, Full),
 341	__DEFINE_LINK_MODE_PARAMS(25000, SR, Full),
 342	__DEFINE_LINK_MODE_PARAMS(50000, CR2, Full),
 343	__DEFINE_LINK_MODE_PARAMS(50000, KR2, Full),
 344	__DEFINE_LINK_MODE_PARAMS(100000, KR4, Full),
 345	__DEFINE_LINK_MODE_PARAMS(100000, SR4, Full),
 346	__DEFINE_LINK_MODE_PARAMS(100000, CR4, Full),
 347	__DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, Full),
 348	__DEFINE_LINK_MODE_PARAMS(50000, SR2, Full),
 349	__DEFINE_LINK_MODE_PARAMS(1000, X, Full),
 350	__DEFINE_LINK_MODE_PARAMS(10000, CR, Full),
 351	__DEFINE_LINK_MODE_PARAMS(10000, SR, Full),
 352	__DEFINE_LINK_MODE_PARAMS(10000, LR, Full),
 353	__DEFINE_LINK_MODE_PARAMS(10000, LRM, Full),
 354	__DEFINE_LINK_MODE_PARAMS(10000, ER, Full),
 355	__DEFINE_LINK_MODE_PARAMS(2500, T, Full),
 356	__DEFINE_LINK_MODE_PARAMS(5000, T, Full),
 357	__DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
 358	__DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
 359	__DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
 360	__DEFINE_LINK_MODE_PARAMS(50000, KR, Full),
 361	__DEFINE_LINK_MODE_PARAMS(50000, SR, Full),
 362	__DEFINE_LINK_MODE_PARAMS(50000, CR, Full),
 363	__DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, Full),
 364	__DEFINE_LINK_MODE_PARAMS(50000, DR, Full),
 365	__DEFINE_LINK_MODE_PARAMS(100000, KR2, Full),
 366	__DEFINE_LINK_MODE_PARAMS(100000, SR2, Full),
 367	__DEFINE_LINK_MODE_PARAMS(100000, CR2, Full),
 368	__DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, Full),
 369	__DEFINE_LINK_MODE_PARAMS(100000, DR2, Full),
 370	__DEFINE_LINK_MODE_PARAMS(200000, KR4, Full),
 371	__DEFINE_LINK_MODE_PARAMS(200000, SR4, Full),
 372	__DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, Full),
 373	__DEFINE_LINK_MODE_PARAMS(200000, DR4, Full),
 374	__DEFINE_LINK_MODE_PARAMS(200000, CR4, Full),
 375	__DEFINE_LINK_MODE_PARAMS(100, T1, Full),
 376	__DEFINE_LINK_MODE_PARAMS(1000, T1, Full),
 377	__DEFINE_LINK_MODE_PARAMS(400000, KR8, Full),
 378	__DEFINE_LINK_MODE_PARAMS(400000, SR8, Full),
 379	__DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, Full),
 380	__DEFINE_LINK_MODE_PARAMS(400000, DR8, Full),
 381	__DEFINE_LINK_MODE_PARAMS(400000, CR8, Full),
 382	__DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
 383	__DEFINE_LINK_MODE_PARAMS(100000, KR, Full),
 384	__DEFINE_LINK_MODE_PARAMS(100000, SR, Full),
 385	__DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, Full),
 386	__DEFINE_LINK_MODE_PARAMS(100000, DR, Full),
 387	__DEFINE_LINK_MODE_PARAMS(100000, CR, Full),
 388	__DEFINE_LINK_MODE_PARAMS(200000, KR2, Full),
 389	__DEFINE_LINK_MODE_PARAMS(200000, SR2, Full),
 390	__DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, Full),
 391	__DEFINE_LINK_MODE_PARAMS(200000, DR2, Full),
 392	__DEFINE_LINK_MODE_PARAMS(200000, CR2, Full),
 393	__DEFINE_LINK_MODE_PARAMS(400000, KR4, Full),
 394	__DEFINE_LINK_MODE_PARAMS(400000, SR4, Full),
 395	__DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, Full),
 396	__DEFINE_LINK_MODE_PARAMS(400000, DR4, Full),
 397	__DEFINE_LINK_MODE_PARAMS(400000, CR4, Full),
 398	__DEFINE_LINK_MODE_PARAMS(100, FX, Half),
 399	__DEFINE_LINK_MODE_PARAMS(100, FX, Full),
 400	__DEFINE_LINK_MODE_PARAMS(10, T1L, Full),
 401	__DEFINE_LINK_MODE_PARAMS(800000, CR8, Full),
 402	__DEFINE_LINK_MODE_PARAMS(800000, KR8, Full),
 403	__DEFINE_LINK_MODE_PARAMS(800000, DR8, Full),
 404	__DEFINE_LINK_MODE_PARAMS(800000, DR8_2, Full),
 405	__DEFINE_LINK_MODE_PARAMS(800000, SR8, Full),
 406	__DEFINE_LINK_MODE_PARAMS(800000, VR8, Full),
 407	__DEFINE_LINK_MODE_PARAMS(10, T1S, Full),
 408	__DEFINE_LINK_MODE_PARAMS(10, T1S, Half),
 409	__DEFINE_LINK_MODE_PARAMS(10, T1S_P2MP, Half),
 410	__DEFINE_LINK_MODE_PARAMS(10, T1BRR, Full),
 411	__DEFINE_LINK_MODE_PARAMS(200000, CR, Full),
 412	__DEFINE_LINK_MODE_PARAMS(200000, KR, Full),
 413	__DEFINE_LINK_MODE_PARAMS(200000, DR, Full),
 414	__DEFINE_LINK_MODE_PARAMS(200000, DR_2, Full),
 415	__DEFINE_LINK_MODE_PARAMS(200000, SR, Full),
 416	__DEFINE_LINK_MODE_PARAMS(200000, VR, Full),
 417	__DEFINE_LINK_MODE_PARAMS(400000, CR2, Full),
 418	__DEFINE_LINK_MODE_PARAMS(400000, KR2, Full),
 419	__DEFINE_LINK_MODE_PARAMS(400000, DR2, Full),
 420	__DEFINE_LINK_MODE_PARAMS(400000, DR2_2, Full),
 421	__DEFINE_LINK_MODE_PARAMS(400000, SR2, Full),
 422	__DEFINE_LINK_MODE_PARAMS(400000, VR2, Full),
 423	__DEFINE_LINK_MODE_PARAMS(800000, CR4, Full),
 424	__DEFINE_LINK_MODE_PARAMS(800000, KR4, Full),
 425	__DEFINE_LINK_MODE_PARAMS(800000, DR4, Full),
 426	__DEFINE_LINK_MODE_PARAMS(800000, DR4_2, Full),
 427	__DEFINE_LINK_MODE_PARAMS(800000, SR4, Full),
 428	__DEFINE_LINK_MODE_PARAMS(800000, VR4, Full),
 429	__DEFINE_LINK_MODE_PARAMS(1600000, CR8, Full),
 430	__DEFINE_LINK_MODE_PARAMS(1600000, KR8, Full),
 431	__DEFINE_LINK_MODE_PARAMS(1600000, DR8, Full),
 432	__DEFINE_LINK_MODE_PARAMS(1600000, DR8_2, Full),
 433};
 434static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
 435EXPORT_SYMBOL_GPL(link_mode_params);
 436
 437const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
 438	[NETIF_MSG_DRV_BIT]		= "drv",
 439	[NETIF_MSG_PROBE_BIT]		= "probe",
 440	[NETIF_MSG_LINK_BIT]		= "link",
 441	[NETIF_MSG_TIMER_BIT]		= "timer",
 442	[NETIF_MSG_IFDOWN_BIT]		= "ifdown",
 443	[NETIF_MSG_IFUP_BIT]		= "ifup",
 444	[NETIF_MSG_RX_ERR_BIT]		= "rx_err",
 445	[NETIF_MSG_TX_ERR_BIT]		= "tx_err",
 446	[NETIF_MSG_TX_QUEUED_BIT]	= "tx_queued",
 447	[NETIF_MSG_INTR_BIT]		= "intr",
 448	[NETIF_MSG_TX_DONE_BIT]		= "tx_done",
 449	[NETIF_MSG_RX_STATUS_BIT]	= "rx_status",
 450	[NETIF_MSG_PKTDATA_BIT]		= "pktdata",
 451	[NETIF_MSG_HW_BIT]		= "hw",
 452	[NETIF_MSG_WOL_BIT]		= "wol",
 453};
 454static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
 455
 456const char wol_mode_names[][ETH_GSTRING_LEN] = {
 457	[const_ilog2(WAKE_PHY)]		= "phy",
 458	[const_ilog2(WAKE_UCAST)]	= "ucast",
 459	[const_ilog2(WAKE_MCAST)]	= "mcast",
 460	[const_ilog2(WAKE_BCAST)]	= "bcast",
 461	[const_ilog2(WAKE_ARP)]		= "arp",
 462	[const_ilog2(WAKE_MAGIC)]	= "magic",
 463	[const_ilog2(WAKE_MAGICSECURE)]	= "magicsecure",
 464	[const_ilog2(WAKE_FILTER)]	= "filter",
 465};
 466static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
 467
 468const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
 469	[const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)]  = "hardware-transmit",
 470	[const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)]  = "software-transmit",
 471	[const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)]  = "hardware-receive",
 472	[const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)]  = "software-receive",
 473	[const_ilog2(SOF_TIMESTAMPING_SOFTWARE)]     = "software-system-clock",
 474	[const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
 475	[const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
 476	[const_ilog2(SOF_TIMESTAMPING_OPT_ID)]       = "option-id",
 477	[const_ilog2(SOF_TIMESTAMPING_TX_SCHED)]     = "sched-transmit",
 478	[const_ilog2(SOF_TIMESTAMPING_TX_ACK)]       = "ack-transmit",
 479	[const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)]     = "option-cmsg",
 480	[const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)]   = "option-tsonly",
 481	[const_ilog2(SOF_TIMESTAMPING_OPT_STATS)]    = "option-stats",
 482	[const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)]  = "option-pktinfo",
 483	[const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)]  = "option-tx-swhw",
 484	[const_ilog2(SOF_TIMESTAMPING_BIND_PHC)]     = "bind-phc",
 485	[const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)]   = "option-id-tcp",
 486	[const_ilog2(SOF_TIMESTAMPING_OPT_RX_FILTER)] = "option-rx-filter",
 487	[const_ilog2(SOF_TIMESTAMPING_TX_COMPLETION)] = "tx-completion",
 488};
 489static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
 490
 491const char ts_tx_type_names[][ETH_GSTRING_LEN] = {
 492	[HWTSTAMP_TX_OFF]		= "off",
 493	[HWTSTAMP_TX_ON]		= "on",
 494	[HWTSTAMP_TX_ONESTEP_SYNC]	= "onestep-sync",
 495	[HWTSTAMP_TX_ONESTEP_P2P]	= "onestep-p2p",
 496};
 497static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
 498
 499const char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
 500	[HWTSTAMP_FILTER_NONE]			= "none",
 501	[HWTSTAMP_FILTER_ALL]			= "all",
 502	[HWTSTAMP_FILTER_SOME]			= "some",
 503	[HWTSTAMP_FILTER_PTP_V1_L4_EVENT]	= "ptpv1-l4-event",
 504	[HWTSTAMP_FILTER_PTP_V1_L4_SYNC]	= "ptpv1-l4-sync",
 505	[HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ]	= "ptpv1-l4-delay-req",
 506	[HWTSTAMP_FILTER_PTP_V2_L4_EVENT]	= "ptpv2-l4-event",
 507	[HWTSTAMP_FILTER_PTP_V2_L4_SYNC]	= "ptpv2-l4-sync",
 508	[HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ]	= "ptpv2-l4-delay-req",
 509	[HWTSTAMP_FILTER_PTP_V2_L2_EVENT]	= "ptpv2-l2-event",
 510	[HWTSTAMP_FILTER_PTP_V2_L2_SYNC]	= "ptpv2-l2-sync",
 511	[HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ]	= "ptpv2-l2-delay-req",
 512	[HWTSTAMP_FILTER_PTP_V2_EVENT]		= "ptpv2-event",
 513	[HWTSTAMP_FILTER_PTP_V2_SYNC]		= "ptpv2-sync",
 514	[HWTSTAMP_FILTER_PTP_V2_DELAY_REQ]	= "ptpv2-delay-req",
 515	[HWTSTAMP_FILTER_NTP_ALL]		= "ntp-all",
 516};
 517static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
 518
 519const char ts_flags_names[][ETH_GSTRING_LEN] = {
 520	[const_ilog2(HWTSTAMP_FLAG_BONDED_PHC_INDEX)] = "bonded-phc-index",
 521};
 522static_assert(ARRAY_SIZE(ts_flags_names) == __HWTSTAMP_FLAG_CNT);
 523
 524const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
 525	[ETHTOOL_UDP_TUNNEL_TYPE_VXLAN]		= "vxlan",
 526	[ETHTOOL_UDP_TUNNEL_TYPE_GENEVE]	= "geneve",
 527	[ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE]	= "vxlan-gpe",
 528};
 529static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
 530	      __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
 531
 532/* return false if legacy contained non-0 deprecated fields
 533 * maxtxpkt/maxrxpkt. rest of ksettings always updated
 534 */
 535bool
 536convert_legacy_settings_to_link_ksettings(
 537	struct ethtool_link_ksettings *link_ksettings,
 538	const struct ethtool_cmd *legacy_settings)
 539{
 540	bool retval = true;
 541
 542	memset(link_ksettings, 0, sizeof(*link_ksettings));
 543
 544	/* This is used to tell users that driver is still using these
 545	 * deprecated legacy fields, and they should not use
 546	 * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
 547	 */
 548	if (legacy_settings->maxtxpkt ||
 549	    legacy_settings->maxrxpkt)
 550		retval = false;
 551
 552	ethtool_convert_legacy_u32_to_link_mode(
 553		link_ksettings->link_modes.supported,
 554		legacy_settings->supported);
 555	ethtool_convert_legacy_u32_to_link_mode(
 556		link_ksettings->link_modes.advertising,
 557		legacy_settings->advertising);
 558	ethtool_convert_legacy_u32_to_link_mode(
 559		link_ksettings->link_modes.lp_advertising,
 560		legacy_settings->lp_advertising);
 561	link_ksettings->base.speed
 562		= ethtool_cmd_speed(legacy_settings);
 563	link_ksettings->base.duplex
 564		= legacy_settings->duplex;
 565	link_ksettings->base.port
 566		= legacy_settings->port;
 567	link_ksettings->base.phy_address
 568		= legacy_settings->phy_address;
 569	link_ksettings->base.autoneg
 570		= legacy_settings->autoneg;
 571	link_ksettings->base.mdio_support
 572		= legacy_settings->mdio_support;
 573	link_ksettings->base.eth_tp_mdix
 574		= legacy_settings->eth_tp_mdix;
 575	link_ksettings->base.eth_tp_mdix_ctrl
 576		= legacy_settings->eth_tp_mdix_ctrl;
 577	return retval;
 578}
 579
 580int __ethtool_get_link(struct net_device *dev)
 581{
 582	if (!dev->ethtool_ops->get_link)
 583		return -EOPNOTSUPP;
 584
 585	return netif_running(dev) && dev->ethtool_ops->get_link(dev);
 586}
 587
 588int ethtool_get_rx_ring_count(struct net_device *dev)
 589{
 590	const struct ethtool_ops *ops = dev->ethtool_ops;
 591	struct ethtool_rxnfc rx_rings = {};
 592	int ret;
 593
 594	if (ops->get_rx_ring_count)
 595		return ops->get_rx_ring_count(dev);
 596
 597	if (!ops->get_rxnfc)
 598		return -EOPNOTSUPP;
 599
 600	rx_rings.cmd = ETHTOOL_GRXRINGS;
 601	ret = ops->get_rxnfc(dev, &rx_rings, NULL);
 602	if (ret < 0)
 603		return ret;
 604
 605	return rx_rings.data;
 606}
 607
 608static int ethtool_get_rxnfc_rule_count(struct net_device *dev)
 609{
 610	const struct ethtool_ops *ops = dev->ethtool_ops;
 611	struct ethtool_rxnfc info = {
 612		.cmd = ETHTOOL_GRXCLSRLCNT,
 613	};
 614	int err;
 615
 616	err = ops->get_rxnfc(dev, &info, NULL);
 617	if (err)
 618		return err;
 619
 620	return info.rule_cnt;
 621}
 622
 623/* Max offset for one RSS context */
 624static u32 ethtool_get_rss_ctx_max_channel(struct ethtool_rxfh_context *ctx)
 625{
 626	u32 max_ring = 0;
 627	u32 i, *tbl;
 628
 629	if (WARN_ON_ONCE(!ctx))
 630		return 0;
 631	tbl = ethtool_rxfh_context_indir(ctx);
 632	for (i = 0; i < ctx->indir_size; i++)
 633		max_ring = max(max_ring, tbl[i]);
 634	return max_ring;
 635}
 636
 637static int ethtool_get_max_rxnfc_channel(struct net_device *dev, u64 *max)
 638{
 639	const struct ethtool_ops *ops = dev->ethtool_ops;
 640	struct ethtool_rxnfc *info;
 641	int err, i, rule_cnt;
 642	u64 max_ring = 0;
 643
 644	if (!ops->get_rxnfc)
 645		return -EOPNOTSUPP;
 646
 647	rule_cnt = ethtool_get_rxnfc_rule_count(dev);
 648	if (rule_cnt <= 0)
 649		return -EINVAL;
 650
 651	info = kvzalloc(struct_size(info, rule_locs, rule_cnt), GFP_KERNEL);
 652	if (!info)
 653		return -ENOMEM;
 654
 655	info->cmd = ETHTOOL_GRXCLSRLALL;
 656	info->rule_cnt = rule_cnt;
 657	err = ops->get_rxnfc(dev, info, info->rule_locs);
 658	if (err)
 659		goto err_free_info;
 660
 661	for (i = 0; i < rule_cnt; i++) {
 662		struct ethtool_rxnfc rule_info = {
 663			.cmd = ETHTOOL_GRXCLSRULE,
 664			.fs.location = info->rule_locs[i],
 665		};
 666
 667		err = ops->get_rxnfc(dev, &rule_info, NULL);
 668		if (err)
 669			goto err_free_info;
 670
 671		if (rule_info.fs.ring_cookie != RX_CLS_FLOW_DISC &&
 672		    rule_info.fs.ring_cookie != RX_CLS_FLOW_WAKE &&
 673		    !ethtool_get_flow_spec_ring_vf(rule_info.fs.ring_cookie)) {
 674			u64 ring = rule_info.fs.ring_cookie;
 675
 676			if (rule_info.flow_type & FLOW_RSS) {
 677				struct ethtool_rxfh_context *ctx;
 678
 679				ctx = xa_load(&dev->ethtool->rss_ctx,
 680					      rule_info.rss_context);
 681				ring += ethtool_get_rss_ctx_max_channel(ctx);
 682			}
 683			max_ring = max_t(u64, max_ring, ring);
 684		}
 685	}
 686
 687	kvfree(info);
 688	*max = max_ring;
 689	return 0;
 690
 691err_free_info:
 692	kvfree(info);
 693	return err;
 694}
 695
 696/* Max offset across all of a device's RSS contexts */
 697static u32 ethtool_get_max_rss_ctx_channel(struct net_device *dev)
 698{
 699	struct ethtool_rxfh_context *ctx;
 700	unsigned long context;
 701	u32 max_ring = 0;
 702
 703	mutex_lock(&dev->ethtool->rss_lock);
 704	xa_for_each(&dev->ethtool->rss_ctx, context, ctx)
 705		max_ring = max(max_ring, ethtool_get_rss_ctx_max_channel(ctx));
 706	mutex_unlock(&dev->ethtool->rss_lock);
 707
 708	return max_ring;
 709}
 710
 711static u32 ethtool_get_max_rxfh_channel(struct net_device *dev)
 712{
 713	struct ethtool_rxfh_param rxfh = {};
 714	u32 dev_size, current_max = 0;
 715	int ret;
 716
 717	/* While we do track whether RSS context has an indirection
 718	 * table explicitly set by the user, no driver looks at that bit.
 719	 * Assume drivers won't auto-regenerate the additional tables,
 720	 * to be safe.
 721	 */
 722	current_max = ethtool_get_max_rss_ctx_channel(dev);
 723
 724	if (!netif_is_rxfh_configured(dev))
 725		return current_max;
 726
 727	if (!dev->ethtool_ops->get_rxfh_indir_size ||
 728	    !dev->ethtool_ops->get_rxfh)
 729		return current_max;
 730	dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
 731	if (dev_size == 0)
 732		return current_max;
 733
 734	rxfh.indir = kcalloc(dev_size, sizeof(rxfh.indir[0]), GFP_USER);
 735	if (!rxfh.indir)
 736		return U32_MAX;
 737
 738	mutex_lock(&dev->ethtool->rss_lock);
 739	ret = dev->ethtool_ops->get_rxfh(dev, &rxfh);
 740	mutex_unlock(&dev->ethtool->rss_lock);
 741	if (ret) {
 742		current_max = U32_MAX;
 743		goto out_free;
 744	}
 745
 746	while (dev_size--)
 747		current_max = max(current_max, rxfh.indir[dev_size]);
 748
 749out_free:
 750	kfree(rxfh.indir);
 751	return current_max;
 752}
 753
 754int ethtool_check_max_channel(struct net_device *dev,
 755			      struct ethtool_channels channels,
 756			      struct genl_info *info)
 757{
 758	u64 max_rxnfc_in_use;
 759	u32 max_rxfh_in_use;
 760	int max_mp_in_use;
 761
 762	/* ensure the new Rx count fits within the configured Rx flow
 763	 * indirection table/rxnfc settings
 764	 */
 765	if (ethtool_get_max_rxnfc_channel(dev, &max_rxnfc_in_use))
 766		max_rxnfc_in_use = 0;
 767	max_rxfh_in_use = ethtool_get_max_rxfh_channel(dev);
 768	if (channels.combined_count + channels.rx_count <= max_rxfh_in_use) {
 769		if (info)
 770			GENL_SET_ERR_MSG_FMT(info, "requested channel counts are too low for existing indirection table (%d)", max_rxfh_in_use);
 771		return -EINVAL;
 772	}
 773	if (channels.combined_count + channels.rx_count <= max_rxnfc_in_use) {
 774		if (info)
 775			GENL_SET_ERR_MSG(info, "requested channel counts are too low for existing ntuple filter settings");
 776		return -EINVAL;
 777	}
 778
 779	max_mp_in_use = dev_get_min_mp_channel_count(dev);
 780	if (channels.combined_count + channels.rx_count <= max_mp_in_use) {
 781		if (info)
 782			GENL_SET_ERR_MSG_FMT(info, "requested channel counts are too low for existing memory provider setting (%d)", max_mp_in_use);
 783		return -EINVAL;
 784	}
 785
 786	return 0;
 787}
 788
 789int ethtool_check_rss_ctx_busy(struct net_device *dev, u32 rss_context)
 790{
 791	const struct ethtool_ops *ops = dev->ethtool_ops;
 792	struct ethtool_rxnfc *info;
 793	int rc, i, rule_cnt;
 794
 795	if (!ops->get_rxnfc)
 796		return 0;
 797
 798	rule_cnt = ethtool_get_rxnfc_rule_count(dev);
 799	if (!rule_cnt)
 800		return 0;
 801
 802	if (rule_cnt < 0)
 803		return -EINVAL;
 804
 805	info = kvzalloc(struct_size(info, rule_locs, rule_cnt), GFP_KERNEL);
 806	if (!info)
 807		return -ENOMEM;
 808
 809	info->cmd = ETHTOOL_GRXCLSRLALL;
 810	info->rule_cnt = rule_cnt;
 811	rc = ops->get_rxnfc(dev, info, info->rule_locs);
 812	if (rc)
 813		goto out_free;
 814
 815	for (i = 0; i < rule_cnt; i++) {
 816		struct ethtool_rxnfc rule_info = {
 817			.cmd = ETHTOOL_GRXCLSRULE,
 818			.fs.location = info->rule_locs[i],
 819		};
 820
 821		rc = ops->get_rxnfc(dev, &rule_info, NULL);
 822		if (rc)
 823			goto out_free;
 824
 825		if (rule_info.fs.flow_type & FLOW_RSS &&
 826		    rule_info.rss_context == rss_context) {
 827			rc = -EBUSY;
 828			goto out_free;
 829		}
 830	}
 831
 832out_free:
 833	kvfree(info);
 834	return rc;
 835}
 836
 837struct ethtool_rxfh_context *
 838ethtool_rxfh_ctx_alloc(const struct ethtool_ops *ops,
 839		       u32 indir_size, u32 key_size)
 840{
 841	size_t indir_bytes, flex_len, key_off, size;
 842	struct ethtool_rxfh_context *ctx;
 843	u32 priv_bytes, indir_max;
 844	u16 key_max;
 845
 846	key_max = max(key_size, ops->rxfh_key_space);
 847	indir_max = max(indir_size, ops->rxfh_indir_space);
 848
 849	priv_bytes = ALIGN(ops->rxfh_priv_size, sizeof(u32));
 850	indir_bytes = array_size(indir_max, sizeof(u32));
 851
 852	key_off = size_add(priv_bytes, indir_bytes);
 853	flex_len = size_add(key_off, key_max);
 854	size = struct_size_t(struct ethtool_rxfh_context, data, flex_len);
 855
 856	ctx = kzalloc(size, GFP_KERNEL_ACCOUNT);
 857	if (!ctx)
 858		return NULL;
 859
 860	ctx->indir_size = indir_size;
 861	ctx->key_size = key_size;
 862	ctx->key_off = key_off;
 863	ctx->priv_size = ops->rxfh_priv_size;
 864
 865	return ctx;
 866}
 867
 868/* Check if fields configured for flow hash are symmetric - if src is included
 869 * so is dst and vice versa.
 870 */
 871int ethtool_rxfh_config_is_sym(u64 rxfh)
 872{
 873	bool sym;
 874
 875	sym = rxfh == (rxfh & (RXH_IP_SRC | RXH_IP_DST |
 876			       RXH_L4_B_0_1 | RXH_L4_B_2_3));
 877	sym &= !!(rxfh & RXH_IP_SRC)   == !!(rxfh & RXH_IP_DST);
 878	sym &= !!(rxfh & RXH_L4_B_0_1) == !!(rxfh & RXH_L4_B_2_3);
 879
 880	return sym;
 881}
 882
 883int ethtool_check_ops(const struct ethtool_ops *ops)
 884{
 885	if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
 886		return -EINVAL;
 887	if (WARN_ON(ops->rxfh_max_num_contexts == 1))
 888		return -EINVAL;
 889	if (WARN_ON(ops->supported_input_xfrm && !ops->get_rxfh_fields))
 890		return -EINVAL;
 891	if (WARN_ON(ops->supported_input_xfrm &&
 892		    ops->rxfh_per_ctx_fields != ops->rxfh_per_ctx_key))
 893		return -EINVAL;
 894
 895	/* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
 896	 * the fact that ops are checked at registration time does not
 897	 * mean the ops attached to a netdev later on are sane.
 898	 */
 899	return 0;
 900}
 901
 902void ethtool_ringparam_get_cfg(struct net_device *dev,
 903			       struct ethtool_ringparam *param,
 904			       struct kernel_ethtool_ringparam *kparam,
 905			       struct netlink_ext_ack *extack)
 906{
 907	memset(param, 0, sizeof(*param));
 908	memset(kparam, 0, sizeof(*kparam));
 909
 910	param->cmd = ETHTOOL_GRINGPARAM;
 911	dev->ethtool_ops->get_ringparam(dev, param, kparam, extack);
 912
 913	/* Driver gives us current state, we want to return current config */
 914	kparam->tcp_data_split = dev->cfg->hds_config;
 915	kparam->hds_thresh = dev->cfg->hds_thresh;
 916}
 917
 918static void ethtool_init_tsinfo(struct kernel_ethtool_ts_info *info)
 919{
 920	memset(info, 0, sizeof(*info));
 921	info->cmd = ETHTOOL_GET_TS_INFO;
 922	info->phc_index = -1;
 923}
 924
 925int ethtool_net_get_ts_info_by_phc(struct net_device *dev,
 926				   struct kernel_ethtool_ts_info *info,
 927				   struct hwtstamp_provider_desc *hwprov_desc)
 928{
 929	const struct ethtool_ops *ops = dev->ethtool_ops;
 930	int err;
 931
 932	if (!ops->get_ts_info)
 933		return -EOPNOTSUPP;
 934
 935	/* Does ptp comes from netdev */
 936	ethtool_init_tsinfo(info);
 937	info->phc_qualifier = hwprov_desc->qualifier;
 938	err = ops->get_ts_info(dev, info);
 939	if (err)
 940		return err;
 941
 942	if (info->phc_index == hwprov_desc->index &&
 943	    net_support_hwtstamp_qualifier(dev, hwprov_desc->qualifier))
 944		return 0;
 945
 946	return -ENODEV;
 947}
 948
 949struct phy_device *
 950ethtool_phy_get_ts_info_by_phc(struct net_device *dev,
 951			       struct kernel_ethtool_ts_info *info,
 952			       struct hwtstamp_provider_desc *hwprov_desc)
 953{
 954	int err;
 955
 956	/* Only precise qualifier is supported in phydev */
 957	if (hwprov_desc->qualifier != HWTSTAMP_PROVIDER_QUALIFIER_PRECISE)
 958		return ERR_PTR(-ENODEV);
 959
 960	/* Look in the phy topology */
 961	if (dev->link_topo) {
 962		struct phy_device_node *pdn;
 963		unsigned long phy_index;
 964
 965		xa_for_each(&dev->link_topo->phys, phy_index, pdn) {
 966			if (!phy_has_tsinfo(pdn->phy))
 967				continue;
 968
 969			ethtool_init_tsinfo(info);
 970			err = phy_ts_info(pdn->phy, info);
 971			if (err)
 972				return ERR_PTR(err);
 973
 974			if (info->phc_index == hwprov_desc->index)
 975				return pdn->phy;
 976		}
 977		return ERR_PTR(-ENODEV);
 978	}
 979
 980	/* Look on the dev->phydev */
 981	if (phy_has_tsinfo(dev->phydev)) {
 982		ethtool_init_tsinfo(info);
 983		err = phy_ts_info(dev->phydev, info);
 984		if (err)
 985			return ERR_PTR(err);
 986
 987		if (info->phc_index == hwprov_desc->index)
 988			return dev->phydev;
 989	}
 990
 991	return ERR_PTR(-ENODEV);
 992}
 993
 994int ethtool_get_ts_info_by_phc(struct net_device *dev,
 995			       struct kernel_ethtool_ts_info *info,
 996			       struct hwtstamp_provider_desc *hwprov_desc)
 997{
 998	int err;
 999
1000	err = ethtool_net_get_ts_info_by_phc(dev, info, hwprov_desc);
1001	if (err == -ENODEV || err == -EOPNOTSUPP) {
1002		struct phy_device *phy;
1003
1004		phy = ethtool_phy_get_ts_info_by_phc(dev, info, hwprov_desc);
1005		if (IS_ERR(phy))
1006			return PTR_ERR(phy);
1007
1008		/* Report the phc source only if we have a real
1009		 * phc source with an index.
1010		 */
1011		if (info->phc_index >= 0) {
1012			info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
1013			info->phc_phyindex = phy->phyindex;
1014		}
1015		err = 0;
1016	} else if (!err && info->phc_index >= 0) {
1017		info->phc_source = HWTSTAMP_SOURCE_NETDEV;
1018	}
1019
1020	info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
1021				 SOF_TIMESTAMPING_SOFTWARE;
1022
1023	return err;
1024}
1025
1026int __ethtool_get_ts_info(struct net_device *dev,
1027			  struct kernel_ethtool_ts_info *info)
1028{
1029	struct hwtstamp_provider *hwprov;
1030	int err = 0;
1031
1032	rcu_read_lock();
1033	hwprov = rcu_dereference(dev->hwprov);
1034	/* No provider specified, use default behavior */
1035	if (!hwprov) {
1036		const struct ethtool_ops *ops = dev->ethtool_ops;
1037		struct phy_device *phydev = dev->phydev;
1038
1039		ethtool_init_tsinfo(info);
1040		if (phy_is_default_hwtstamp(phydev) &&
1041		    phy_has_tsinfo(phydev)) {
1042			err = phy_ts_info(phydev, info);
1043			/* Report the phc source only if we have a real
1044			 * phc source with an index.
1045			 */
1046			if (!err && info->phc_index >= 0) {
1047				info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
1048				info->phc_phyindex = phydev->phyindex;
1049			}
1050		} else if (ops->get_ts_info) {
1051			err = ops->get_ts_info(dev, info);
1052			if (!err && info->phc_index >= 0)
1053				info->phc_source = HWTSTAMP_SOURCE_NETDEV;
1054		}
1055
1056		info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
1057					 SOF_TIMESTAMPING_SOFTWARE;
1058
1059		rcu_read_unlock();
1060		return err;
1061	}
1062
1063	err = ethtool_get_ts_info_by_phc(dev, info, &hwprov->desc);
1064	rcu_read_unlock();
1065	return err;
1066}
1067
1068bool net_support_hwtstamp_qualifier(struct net_device *dev,
1069				    enum hwtstamp_provider_qualifier qualifier)
1070{
1071	const struct ethtool_ops *ops = dev->ethtool_ops;
1072
1073	if (!ops)
1074		return false;
1075
1076	/* Return true with precise qualifier and with NIC without
1077	 * qualifier description to not break the old behavior.
1078	 */
1079	if (!ops->supported_hwtstamp_qualifiers &&
1080	    qualifier == HWTSTAMP_PROVIDER_QUALIFIER_PRECISE)
1081		return true;
1082
1083	if (ops->supported_hwtstamp_qualifiers & BIT(qualifier))
1084		return true;
1085
1086	return false;
1087}
1088
1089int ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index)
1090{
1091	struct kernel_ethtool_ts_info info = { };
1092	int num = 0;
1093
1094	if (!__ethtool_get_ts_info(dev, &info))
1095		num = ptp_get_vclocks_index(info.phc_index, vclock_index);
1096
1097	return num;
1098}
1099EXPORT_SYMBOL(ethtool_get_phc_vclocks);
1100
1101int ethtool_get_ts_info_by_layer(struct net_device *dev, struct kernel_ethtool_ts_info *info)
1102{
1103	return __ethtool_get_ts_info(dev, info);
1104}
1105EXPORT_SYMBOL(ethtool_get_ts_info_by_layer);
1106
1107const struct ethtool_phy_ops *ethtool_phy_ops;
1108
1109void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
1110{
1111	ASSERT_RTNL();
1112	ethtool_phy_ops = ops;
1113}
1114EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);
1115
1116void
1117ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
1118			      enum ethtool_link_mode_bit_indices link_mode)
1119{
1120	const struct link_mode_info *link_info;
1121
1122	if (WARN_ON_ONCE(link_mode >= __ETHTOOL_LINK_MODE_MASK_NBITS))
1123		return;
1124
1125	link_info = &link_mode_params[link_mode];
1126	link_ksettings->base.speed = link_info->speed;
1127	link_ksettings->lanes = link_info->lanes;
1128	link_ksettings->base.duplex = link_info->duplex;
1129}
1130EXPORT_SYMBOL_GPL(ethtool_params_from_link_mode);
1131
1132/**
1133 * ethtool_forced_speed_maps_init
1134 * @maps: Pointer to an array of Ethtool forced speed map
1135 * @size: Array size
1136 *
1137 * Initialize an array of Ethtool forced speed map to Ethtool link modes. This
1138 * should be called during driver module init.
1139 */
1140void
1141ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size)
1142{
1143	for (u32 i = 0; i < size; i++) {
1144		struct ethtool_forced_speed_map *map = &maps[i];
1145
1146		linkmode_set_bit_array(map->cap_arr, map->arr_size, map->caps);
1147		map->cap_arr = NULL;
1148		map->arr_size = 0;
1149	}
1150}
1151EXPORT_SYMBOL_GPL(ethtool_forced_speed_maps_init);
1152
1153void ethtool_rxfh_context_lost(struct net_device *dev, u32 context_id)
1154{
1155	struct ethtool_rxfh_context *ctx;
1156
1157	WARN_ONCE(!rtnl_is_locked() &&
1158		  !lockdep_is_held_type(&dev->ethtool->rss_lock, -1),
1159		  "RSS context lock assertion failed\n");
1160
1161	netdev_err(dev, "device error, RSS context %d lost\n", context_id);
1162	ctx = xa_erase(&dev->ethtool->rss_ctx, context_id);
1163	kfree(ctx);
1164	ethtool_rss_notify(dev, ETHTOOL_MSG_RSS_DELETE_NTF, context_id);
1165}
1166EXPORT_SYMBOL(ethtool_rxfh_context_lost);
~/ Read-only file preview.