^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <linux/ethtool_netlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/net_tstamp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/phy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/rtnetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) [NETIF_F_SG_BIT] = "tx-scatter-gather",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) [NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) [NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) [NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) [NETIF_F_HIGHDMA_BIT] = "highdma",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) [NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) [NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) [NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) [NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) [NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) [NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) [NETIF_F_GSO_BIT] = "tx-generic-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) [NETIF_F_LLTX_BIT] = "tx-lockless",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) [NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) [NETIF_F_GRO_BIT] = "rx-gro",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) [NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) [NETIF_F_LRO_BIT] = "rx-lro",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) [NETIF_F_TSO_BIT] = "tx-tcp-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) [NETIF_F_GSO_ROBUST_BIT] = "tx-gso-robust",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) [NETIF_F_TSO_ECN_BIT] = "tx-tcp-ecn-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) [NETIF_F_TSO_MANGLEID_BIT] = "tx-tcp-mangleid-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) [NETIF_F_TSO6_BIT] = "tx-tcp6-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) [NETIF_F_FSO_BIT] = "tx-fcoe-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) [NETIF_F_GSO_GRE_BIT] = "tx-gre-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) [NETIF_F_GSO_GRE_CSUM_BIT] = "tx-gre-csum-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) [NETIF_F_GSO_IPXIP4_BIT] = "tx-ipxip4-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) [NETIF_F_GSO_IPXIP6_BIT] = "tx-ipxip6-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) [NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) [NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) [NETIF_F_GSO_PARTIAL_BIT] = "tx-gso-partial",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) [NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) [NETIF_F_GSO_SCTP_BIT] = "tx-sctp-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) [NETIF_F_GSO_ESP_BIT] = "tx-esp-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) [NETIF_F_GSO_UDP_L4_BIT] = "tx-udp-segmentation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) [NETIF_F_GSO_FRAGLIST_BIT] = "tx-gso-list",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) [NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) [NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) [NETIF_F_FCOE_MTU_BIT] = "fcoe-mtu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) [NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) [NETIF_F_RXHASH_BIT] = "rx-hashing",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) [NETIF_F_RXCSUM_BIT] = "rx-checksum",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) [NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) [NETIF_F_LOOPBACK_BIT] = "loopback",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) [NETIF_F_RXFCS_BIT] = "rx-fcs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) [NETIF_F_RXALL_BIT] = "rx-all",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) [NETIF_F_HW_TC_BIT] = "hw-tc-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) [NETIF_F_HW_ESP_BIT] = "esp-hw-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) [NETIF_F_HW_ESP_TX_CSUM_BIT] = "esp-tx-csum-hw-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) [NETIF_F_RX_UDP_TUNNEL_PORT_BIT] = "rx-udp_tunnel-port-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) [NETIF_F_HW_TLS_RECORD_BIT] = "tls-hw-record",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) [NETIF_F_HW_TLS_TX_BIT] = "tls-hw-tx-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) [NETIF_F_HW_TLS_RX_BIT] = "tls-hw-rx-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) [NETIF_F_GRO_FRAGLIST_BIT] = "rx-gro-list",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) [NETIF_F_HW_MACSEC_BIT] = "macsec-hw-offload",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) const char
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) [ETH_RSS_HASH_TOP_BIT] = "toeplitz",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) [ETH_RSS_HASH_XOR_BIT] = "xor",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) [ETH_RSS_HASH_CRC32_BIT] = "crc32",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) const char
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) [ETHTOOL_ID_UNSPEC] = "Unspec",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) [ETHTOOL_RX_COPYBREAK] = "rx-copybreak",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) [ETHTOOL_TX_COPYBREAK] = "tx-copybreak",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) const char
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) [ETHTOOL_ID_UNSPEC] = "Unspec",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) [ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) [ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) [ETHTOOL_PHY_EDPD] = "phy-energy-detect-power-down",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define __LINK_MODE_NAME(speed, type, duplex) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #speed "base" #type "/" #duplex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) [ETHTOOL_LINK_MODE(speed, type, duplex)] = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) __LINK_MODE_NAME(speed, type, duplex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) const char link_mode_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) __DEFINE_LINK_MODE_NAME(10, T, Half),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) __DEFINE_LINK_MODE_NAME(10, T, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) __DEFINE_LINK_MODE_NAME(100, T, Half),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) __DEFINE_LINK_MODE_NAME(100, T, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) __DEFINE_LINK_MODE_NAME(1000, T, Half),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) __DEFINE_LINK_MODE_NAME(1000, T, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) __DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) __DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) __DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) __DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) __DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) __DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) __DEFINE_LINK_MODE_NAME(10000, T, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) __DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) __DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) __DEFINE_LINK_MODE_NAME(2500, X, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) __DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) __DEFINE_LINK_MODE_NAME(1000, KX, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) __DEFINE_LINK_MODE_NAME(10000, KX4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) __DEFINE_LINK_MODE_NAME(10000, KR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) __DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) __DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) __DEFINE_LINK_MODE_NAME(20000, KR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) __DEFINE_LINK_MODE_NAME(40000, KR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) __DEFINE_LINK_MODE_NAME(40000, CR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) __DEFINE_LINK_MODE_NAME(40000, SR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __DEFINE_LINK_MODE_NAME(40000, LR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) __DEFINE_LINK_MODE_NAME(56000, KR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) __DEFINE_LINK_MODE_NAME(56000, CR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) __DEFINE_LINK_MODE_NAME(56000, SR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) __DEFINE_LINK_MODE_NAME(56000, LR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) __DEFINE_LINK_MODE_NAME(25000, CR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) __DEFINE_LINK_MODE_NAME(25000, KR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) __DEFINE_LINK_MODE_NAME(25000, SR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) __DEFINE_LINK_MODE_NAME(50000, CR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) __DEFINE_LINK_MODE_NAME(50000, KR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) __DEFINE_LINK_MODE_NAME(100000, KR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) __DEFINE_LINK_MODE_NAME(100000, SR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) __DEFINE_LINK_MODE_NAME(100000, CR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) __DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) __DEFINE_LINK_MODE_NAME(50000, SR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) __DEFINE_LINK_MODE_NAME(1000, X, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) __DEFINE_LINK_MODE_NAME(10000, CR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) __DEFINE_LINK_MODE_NAME(10000, SR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) __DEFINE_LINK_MODE_NAME(10000, LR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) __DEFINE_LINK_MODE_NAME(10000, LRM, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) __DEFINE_LINK_MODE_NAME(10000, ER, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) __DEFINE_LINK_MODE_NAME(2500, T, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) __DEFINE_LINK_MODE_NAME(5000, T, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) __DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) __DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) __DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) __DEFINE_LINK_MODE_NAME(50000, KR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) __DEFINE_LINK_MODE_NAME(50000, SR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) __DEFINE_LINK_MODE_NAME(50000, CR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) __DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) __DEFINE_LINK_MODE_NAME(50000, DR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) __DEFINE_LINK_MODE_NAME(100000, KR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) __DEFINE_LINK_MODE_NAME(100000, SR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) __DEFINE_LINK_MODE_NAME(100000, CR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) __DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) __DEFINE_LINK_MODE_NAME(100000, DR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) __DEFINE_LINK_MODE_NAME(200000, KR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) __DEFINE_LINK_MODE_NAME(200000, SR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) __DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) __DEFINE_LINK_MODE_NAME(200000, DR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) __DEFINE_LINK_MODE_NAME(200000, CR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) __DEFINE_LINK_MODE_NAME(100, T1, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) __DEFINE_LINK_MODE_NAME(1000, T1, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) __DEFINE_LINK_MODE_NAME(400000, KR8, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) __DEFINE_LINK_MODE_NAME(400000, SR8, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) __DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) __DEFINE_LINK_MODE_NAME(400000, DR8, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) __DEFINE_LINK_MODE_NAME(400000, CR8, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) __DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) __DEFINE_LINK_MODE_NAME(100000, KR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) __DEFINE_LINK_MODE_NAME(100000, SR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) __DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) __DEFINE_LINK_MODE_NAME(100000, DR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) __DEFINE_LINK_MODE_NAME(100000, CR, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) __DEFINE_LINK_MODE_NAME(200000, KR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) __DEFINE_LINK_MODE_NAME(200000, SR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) __DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) __DEFINE_LINK_MODE_NAME(200000, DR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) __DEFINE_LINK_MODE_NAME(200000, CR2, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) __DEFINE_LINK_MODE_NAME(400000, KR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) __DEFINE_LINK_MODE_NAME(400000, SR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) __DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) __DEFINE_LINK_MODE_NAME(400000, DR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) __DEFINE_LINK_MODE_NAME(400000, CR4, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) __DEFINE_LINK_MODE_NAME(100, FX, Half),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) __DEFINE_LINK_MODE_NAME(100, FX, Full),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) [NETIF_MSG_DRV_BIT] = "drv",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) [NETIF_MSG_PROBE_BIT] = "probe",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) [NETIF_MSG_LINK_BIT] = "link",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) [NETIF_MSG_TIMER_BIT] = "timer",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) [NETIF_MSG_IFDOWN_BIT] = "ifdown",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) [NETIF_MSG_IFUP_BIT] = "ifup",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) [NETIF_MSG_RX_ERR_BIT] = "rx_err",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) [NETIF_MSG_TX_ERR_BIT] = "tx_err",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) [NETIF_MSG_TX_QUEUED_BIT] = "tx_queued",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) [NETIF_MSG_INTR_BIT] = "intr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) [NETIF_MSG_TX_DONE_BIT] = "tx_done",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) [NETIF_MSG_RX_STATUS_BIT] = "rx_status",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) [NETIF_MSG_PKTDATA_BIT] = "pktdata",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) [NETIF_MSG_HW_BIT] = "hw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) [NETIF_MSG_WOL_BIT] = "wol",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) const char wol_mode_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) [const_ilog2(WAKE_PHY)] = "phy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) [const_ilog2(WAKE_UCAST)] = "ucast",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) [const_ilog2(WAKE_MCAST)] = "mcast",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) [const_ilog2(WAKE_BCAST)] = "bcast",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) [const_ilog2(WAKE_ARP)] = "arp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) [const_ilog2(WAKE_MAGIC)] = "magic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) [const_ilog2(WAKE_MAGICSECURE)] = "magicsecure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) [const_ilog2(WAKE_FILTER)] = "filter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) [const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)] = "hardware-transmit",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) [const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)] = "software-transmit",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) [const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)] = "hardware-receive",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) [const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)] = "software-receive",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) [const_ilog2(SOF_TIMESTAMPING_SOFTWARE)] = "software-system-clock",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) [const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) [const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) [const_ilog2(SOF_TIMESTAMPING_OPT_ID)] = "option-id",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) [const_ilog2(SOF_TIMESTAMPING_TX_SCHED)] = "sched-transmit",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) [const_ilog2(SOF_TIMESTAMPING_TX_ACK)] = "ack-transmit",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) [const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)] = "option-cmsg",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) [const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)] = "option-tsonly",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) [const_ilog2(SOF_TIMESTAMPING_OPT_STATS)] = "option-stats",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) [const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)] = "option-pktinfo",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) const char ts_tx_type_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) [HWTSTAMP_TX_OFF] = "off",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) [HWTSTAMP_TX_ON] = "on",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) [HWTSTAMP_TX_ONESTEP_SYNC] = "onestep-sync",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) [HWTSTAMP_TX_ONESTEP_P2P] = "onestep-p2p",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) const char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) [HWTSTAMP_FILTER_NONE] = "none",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) [HWTSTAMP_FILTER_ALL] = "all",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) [HWTSTAMP_FILTER_SOME] = "some",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) [HWTSTAMP_FILTER_PTP_V1_L4_EVENT] = "ptpv1-l4-event",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) [HWTSTAMP_FILTER_PTP_V1_L4_SYNC] = "ptpv1-l4-sync",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) [HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ] = "ptpv1-l4-delay-req",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) [HWTSTAMP_FILTER_PTP_V2_L4_EVENT] = "ptpv2-l4-event",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) [HWTSTAMP_FILTER_PTP_V2_L4_SYNC] = "ptpv2-l4-sync",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) [HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ] = "ptpv2-l4-delay-req",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) [HWTSTAMP_FILTER_PTP_V2_L2_EVENT] = "ptpv2-l2-event",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) [HWTSTAMP_FILTER_PTP_V2_L2_SYNC] = "ptpv2-l2-sync",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) [HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ] = "ptpv2-l2-delay-req",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) [HWTSTAMP_FILTER_PTP_V2_EVENT] = "ptpv2-event",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) [HWTSTAMP_FILTER_PTP_V2_SYNC] = "ptpv2-sync",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) [HWTSTAMP_FILTER_PTP_V2_DELAY_REQ] = "ptpv2-delay-req",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) [HWTSTAMP_FILTER_NTP_ALL] = "ntp-all",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN] = "vxlan",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) [ETHTOOL_UDP_TUNNEL_TYPE_GENEVE] = "geneve",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE] = "vxlan-gpe",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /* return false if legacy contained non-0 deprecated fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * maxtxpkt/maxrxpkt. rest of ksettings always updated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) convert_legacy_settings_to_link_ksettings(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct ethtool_link_ksettings *link_ksettings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) const struct ethtool_cmd *legacy_settings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) bool retval = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) memset(link_ksettings, 0, sizeof(*link_ksettings));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* This is used to tell users that driver is still using these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * deprecated legacy fields, and they should not use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (legacy_settings->maxtxpkt ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) legacy_settings->maxrxpkt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) retval = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) ethtool_convert_legacy_u32_to_link_mode(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) link_ksettings->link_modes.supported,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) legacy_settings->supported);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) ethtool_convert_legacy_u32_to_link_mode(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) link_ksettings->link_modes.advertising,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) legacy_settings->advertising);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) ethtool_convert_legacy_u32_to_link_mode(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) link_ksettings->link_modes.lp_advertising,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) legacy_settings->lp_advertising);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) link_ksettings->base.speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) = ethtool_cmd_speed(legacy_settings);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) link_ksettings->base.duplex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) = legacy_settings->duplex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) link_ksettings->base.port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) = legacy_settings->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) link_ksettings->base.phy_address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) = legacy_settings->phy_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) link_ksettings->base.autoneg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) = legacy_settings->autoneg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) link_ksettings->base.mdio_support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) = legacy_settings->mdio_support;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) link_ksettings->base.eth_tp_mdix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) = legacy_settings->eth_tp_mdix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) link_ksettings->base.eth_tp_mdix_ctrl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) = legacy_settings->eth_tp_mdix_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) int __ethtool_get_link(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) if (!dev->ethtool_ops->get_link)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) return netif_running(dev) && dev->ethtool_ops->get_link(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) u32 dev_size, current_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) u32 *indir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if (!dev->ethtool_ops->get_rxfh_indir_size ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) !dev->ethtool_ops->get_rxfh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (dev_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (!indir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) while (dev_size--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) current_max = max(current_max, indir[dev_size]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) *max = current_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) kfree(indir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) int ethtool_check_ops(const struct ethtool_ops *ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * the fact that ops are checked at registration time does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * mean the ops attached to a netdev later on are sane.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) const struct ethtool_ops *ops = dev->ethtool_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) struct phy_device *phydev = dev->phydev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) memset(info, 0, sizeof(*info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) info->cmd = ETHTOOL_GET_TS_INFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (phy_has_tsinfo(phydev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) return phy_ts_info(phydev, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if (ops->get_ts_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) return ops->get_ts_info(dev, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) SOF_TIMESTAMPING_SOFTWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) info->phc_index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) const struct ethtool_phy_ops *ethtool_phy_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) rtnl_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ethtool_phy_ops = ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) rtnl_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);