LCOV - code coverage report
Current view: top level - net/ethtool - common.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 2 71 2.8 %
Date: 2021-04-22 12:43:58 Functions: 1 6 16.7 %

          Line data    Source code
       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             : 
       8             : #include "common.h"
       9             : 
      10             : const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
      11             :         [NETIF_F_SG_BIT] =               "tx-scatter-gather",
      12             :         [NETIF_F_IP_CSUM_BIT] =          "tx-checksum-ipv4",
      13             :         [NETIF_F_HW_CSUM_BIT] =          "tx-checksum-ip-generic",
      14             :         [NETIF_F_IPV6_CSUM_BIT] =        "tx-checksum-ipv6",
      15             :         [NETIF_F_HIGHDMA_BIT] =          "highdma",
      16             :         [NETIF_F_FRAGLIST_BIT] =         "tx-scatter-gather-fraglist",
      17             :         [NETIF_F_HW_VLAN_CTAG_TX_BIT] =  "tx-vlan-hw-insert",
      18             : 
      19             :         [NETIF_F_HW_VLAN_CTAG_RX_BIT] =  "rx-vlan-hw-parse",
      20             :         [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
      21             :         [NETIF_F_HW_VLAN_STAG_TX_BIT] =  "tx-vlan-stag-hw-insert",
      22             :         [NETIF_F_HW_VLAN_STAG_RX_BIT] =  "rx-vlan-stag-hw-parse",
      23             :         [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
      24             :         [NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
      25             :         [NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
      26             :         [NETIF_F_LLTX_BIT] =             "tx-lockless",
      27             :         [NETIF_F_NETNS_LOCAL_BIT] =      "netns-local",
      28             :         [NETIF_F_GRO_BIT] =              "rx-gro",
      29             :         [NETIF_F_GRO_HW_BIT] =           "rx-gro-hw",
      30             :         [NETIF_F_LRO_BIT] =              "rx-lro",
      31             : 
      32             :         [NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
      33             :         [NETIF_F_GSO_ROBUST_BIT] =       "tx-gso-robust",
      34             :         [NETIF_F_TSO_ECN_BIT] =          "tx-tcp-ecn-segmentation",
      35             :         [NETIF_F_TSO_MANGLEID_BIT] =     "tx-tcp-mangleid-segmentation",
      36             :         [NETIF_F_TSO6_BIT] =             "tx-tcp6-segmentation",
      37             :         [NETIF_F_FSO_BIT] =              "tx-fcoe-segmentation",
      38             :         [NETIF_F_GSO_GRE_BIT] =          "tx-gre-segmentation",
      39             :         [NETIF_F_GSO_GRE_CSUM_BIT] =     "tx-gre-csum-segmentation",
      40             :         [NETIF_F_GSO_IPXIP4_BIT] =       "tx-ipxip4-segmentation",
      41             :         [NETIF_F_GSO_IPXIP6_BIT] =       "tx-ipxip6-segmentation",
      42             :         [NETIF_F_GSO_UDP_TUNNEL_BIT] =   "tx-udp_tnl-segmentation",
      43             :         [NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
      44             :         [NETIF_F_GSO_PARTIAL_BIT] =      "tx-gso-partial",
      45             :         [NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
      46             :         [NETIF_F_GSO_SCTP_BIT] =         "tx-sctp-segmentation",
      47             :         [NETIF_F_GSO_ESP_BIT] =          "tx-esp-segmentation",
      48             :         [NETIF_F_GSO_UDP_L4_BIT] =       "tx-udp-segmentation",
      49             :         [NETIF_F_GSO_FRAGLIST_BIT] =     "tx-gso-list",
      50             : 
      51             :         [NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc",
      52             :         [NETIF_F_SCTP_CRC_BIT] =        "tx-checksum-sctp",
      53             :         [NETIF_F_FCOE_MTU_BIT] =         "fcoe-mtu",
      54             :         [NETIF_F_NTUPLE_BIT] =           "rx-ntuple-filter",
      55             :         [NETIF_F_RXHASH_BIT] =           "rx-hashing",
      56             :         [NETIF_F_RXCSUM_BIT] =           "rx-checksum",
      57             :         [NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
      58             :         [NETIF_F_LOOPBACK_BIT] =         "loopback",
      59             :         [NETIF_F_RXFCS_BIT] =            "rx-fcs",
      60             :         [NETIF_F_RXALL_BIT] =            "rx-all",
      61             :         [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
      62             :         [NETIF_F_HW_TC_BIT] =            "hw-tc-offload",
      63             :         [NETIF_F_HW_ESP_BIT] =           "esp-hw-offload",
      64             :         [NETIF_F_HW_ESP_TX_CSUM_BIT] =   "esp-tx-csum-hw-offload",
      65             :         [NETIF_F_RX_UDP_TUNNEL_PORT_BIT] =       "rx-udp_tunnel-port-offload",
      66             :         [NETIF_F_HW_TLS_RECORD_BIT] =   "tls-hw-record",
      67             :         [NETIF_F_HW_TLS_TX_BIT] =        "tls-hw-tx-offload",
      68             :         [NETIF_F_HW_TLS_RX_BIT] =        "tls-hw-rx-offload",
      69             :         [NETIF_F_GRO_FRAGLIST_BIT] =     "rx-gro-list",
      70             :         [NETIF_F_HW_MACSEC_BIT] =        "macsec-hw-offload",
      71             :         [NETIF_F_GRO_UDP_FWD_BIT] =      "rx-udp-gro-forwarding",
      72             :         [NETIF_F_HW_HSR_TAG_INS_BIT] =   "hsr-tag-ins-offload",
      73             :         [NETIF_F_HW_HSR_TAG_RM_BIT] =    "hsr-tag-rm-offload",
      74             :         [NETIF_F_HW_HSR_FWD_BIT] =       "hsr-fwd-offload",
      75             :         [NETIF_F_HW_HSR_DUP_BIT] =       "hsr-dup-offload",
      76             : };
      77             : 
      78             : const char
      79             : rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
      80             :         [ETH_RSS_HASH_TOP_BIT] =        "toeplitz",
      81             :         [ETH_RSS_HASH_XOR_BIT] =        "xor",
      82             :         [ETH_RSS_HASH_CRC32_BIT] =      "crc32",
      83             : };
      84             : 
      85             : const char
      86             : tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
      87             :         [ETHTOOL_ID_UNSPEC]     = "Unspec",
      88             :         [ETHTOOL_RX_COPYBREAK]  = "rx-copybreak",
      89             :         [ETHTOOL_TX_COPYBREAK]  = "tx-copybreak",
      90             :         [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
      91             : };
      92             : 
      93             : const char
      94             : phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
      95             :         [ETHTOOL_ID_UNSPEC]     = "Unspec",
      96             :         [ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
      97             :         [ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
      98             :         [ETHTOOL_PHY_EDPD]      = "phy-energy-detect-power-down",
      99             : };
     100             : 
     101             : #define __LINK_MODE_NAME(speed, type, duplex) \
     102             :         #speed "base" #type "/" #duplex
     103             : #define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
     104             :         [ETHTOOL_LINK_MODE(speed, type, duplex)] = \
     105             :         __LINK_MODE_NAME(speed, type, duplex)
     106             : #define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
     107             :         [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
     108             : 
     109             : const char link_mode_names[][ETH_GSTRING_LEN] = {
     110             :         __DEFINE_LINK_MODE_NAME(10, T, Half),
     111             :         __DEFINE_LINK_MODE_NAME(10, T, Full),
     112             :         __DEFINE_LINK_MODE_NAME(100, T, Half),
     113             :         __DEFINE_LINK_MODE_NAME(100, T, Full),
     114             :         __DEFINE_LINK_MODE_NAME(1000, T, Half),
     115             :         __DEFINE_LINK_MODE_NAME(1000, T, Full),
     116             :         __DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
     117             :         __DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
     118             :         __DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
     119             :         __DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
     120             :         __DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
     121             :         __DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
     122             :         __DEFINE_LINK_MODE_NAME(10000, T, Full),
     123             :         __DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
     124             :         __DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
     125             :         __DEFINE_LINK_MODE_NAME(2500, X, Full),
     126             :         __DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
     127             :         __DEFINE_LINK_MODE_NAME(1000, KX, Full),
     128             :         __DEFINE_LINK_MODE_NAME(10000, KX4, Full),
     129             :         __DEFINE_LINK_MODE_NAME(10000, KR, Full),
     130             :         __DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
     131             :         __DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
     132             :         __DEFINE_LINK_MODE_NAME(20000, KR2, Full),
     133             :         __DEFINE_LINK_MODE_NAME(40000, KR4, Full),
     134             :         __DEFINE_LINK_MODE_NAME(40000, CR4, Full),
     135             :         __DEFINE_LINK_MODE_NAME(40000, SR4, Full),
     136             :         __DEFINE_LINK_MODE_NAME(40000, LR4, Full),
     137             :         __DEFINE_LINK_MODE_NAME(56000, KR4, Full),
     138             :         __DEFINE_LINK_MODE_NAME(56000, CR4, Full),
     139             :         __DEFINE_LINK_MODE_NAME(56000, SR4, Full),
     140             :         __DEFINE_LINK_MODE_NAME(56000, LR4, Full),
     141             :         __DEFINE_LINK_MODE_NAME(25000, CR, Full),
     142             :         __DEFINE_LINK_MODE_NAME(25000, KR, Full),
     143             :         __DEFINE_LINK_MODE_NAME(25000, SR, Full),
     144             :         __DEFINE_LINK_MODE_NAME(50000, CR2, Full),
     145             :         __DEFINE_LINK_MODE_NAME(50000, KR2, Full),
     146             :         __DEFINE_LINK_MODE_NAME(100000, KR4, Full),
     147             :         __DEFINE_LINK_MODE_NAME(100000, SR4, Full),
     148             :         __DEFINE_LINK_MODE_NAME(100000, CR4, Full),
     149             :         __DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
     150             :         __DEFINE_LINK_MODE_NAME(50000, SR2, Full),
     151             :         __DEFINE_LINK_MODE_NAME(1000, X, Full),
     152             :         __DEFINE_LINK_MODE_NAME(10000, CR, Full),
     153             :         __DEFINE_LINK_MODE_NAME(10000, SR, Full),
     154             :         __DEFINE_LINK_MODE_NAME(10000, LR, Full),
     155             :         __DEFINE_LINK_MODE_NAME(10000, LRM, Full),
     156             :         __DEFINE_LINK_MODE_NAME(10000, ER, Full),
     157             :         __DEFINE_LINK_MODE_NAME(2500, T, Full),
     158             :         __DEFINE_LINK_MODE_NAME(5000, T, Full),
     159             :         __DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
     160             :         __DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
     161             :         __DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
     162             :         __DEFINE_LINK_MODE_NAME(50000, KR, Full),
     163             :         __DEFINE_LINK_MODE_NAME(50000, SR, Full),
     164             :         __DEFINE_LINK_MODE_NAME(50000, CR, Full),
     165             :         __DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
     166             :         __DEFINE_LINK_MODE_NAME(50000, DR, Full),
     167             :         __DEFINE_LINK_MODE_NAME(100000, KR2, Full),
     168             :         __DEFINE_LINK_MODE_NAME(100000, SR2, Full),
     169             :         __DEFINE_LINK_MODE_NAME(100000, CR2, Full),
     170             :         __DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
     171             :         __DEFINE_LINK_MODE_NAME(100000, DR2, Full),
     172             :         __DEFINE_LINK_MODE_NAME(200000, KR4, Full),
     173             :         __DEFINE_LINK_MODE_NAME(200000, SR4, Full),
     174             :         __DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
     175             :         __DEFINE_LINK_MODE_NAME(200000, DR4, Full),
     176             :         __DEFINE_LINK_MODE_NAME(200000, CR4, Full),
     177             :         __DEFINE_LINK_MODE_NAME(100, T1, Full),
     178             :         __DEFINE_LINK_MODE_NAME(1000, T1, Full),
     179             :         __DEFINE_LINK_MODE_NAME(400000, KR8, Full),
     180             :         __DEFINE_LINK_MODE_NAME(400000, SR8, Full),
     181             :         __DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
     182             :         __DEFINE_LINK_MODE_NAME(400000, DR8, Full),
     183             :         __DEFINE_LINK_MODE_NAME(400000, CR8, Full),
     184             :         __DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
     185             :         __DEFINE_LINK_MODE_NAME(100000, KR, Full),
     186             :         __DEFINE_LINK_MODE_NAME(100000, SR, Full),
     187             :         __DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
     188             :         __DEFINE_LINK_MODE_NAME(100000, DR, Full),
     189             :         __DEFINE_LINK_MODE_NAME(100000, CR, Full),
     190             :         __DEFINE_LINK_MODE_NAME(200000, KR2, Full),
     191             :         __DEFINE_LINK_MODE_NAME(200000, SR2, Full),
     192             :         __DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
     193             :         __DEFINE_LINK_MODE_NAME(200000, DR2, Full),
     194             :         __DEFINE_LINK_MODE_NAME(200000, CR2, Full),
     195             :         __DEFINE_LINK_MODE_NAME(400000, KR4, Full),
     196             :         __DEFINE_LINK_MODE_NAME(400000, SR4, Full),
     197             :         __DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
     198             :         __DEFINE_LINK_MODE_NAME(400000, DR4, Full),
     199             :         __DEFINE_LINK_MODE_NAME(400000, CR4, Full),
     200             :         __DEFINE_LINK_MODE_NAME(100, FX, Half),
     201             :         __DEFINE_LINK_MODE_NAME(100, FX, Full),
     202             : };
     203             : static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
     204             : 
     205             : #define __LINK_MODE_LANES_CR            1
     206             : #define __LINK_MODE_LANES_CR2           2
     207             : #define __LINK_MODE_LANES_CR4           4
     208             : #define __LINK_MODE_LANES_CR8           8
     209             : #define __LINK_MODE_LANES_DR            1
     210             : #define __LINK_MODE_LANES_DR2           2
     211             : #define __LINK_MODE_LANES_DR4           4
     212             : #define __LINK_MODE_LANES_DR8           8
     213             : #define __LINK_MODE_LANES_KR            1
     214             : #define __LINK_MODE_LANES_KR2           2
     215             : #define __LINK_MODE_LANES_KR4           4
     216             : #define __LINK_MODE_LANES_KR8           8
     217             : #define __LINK_MODE_LANES_SR            1
     218             : #define __LINK_MODE_LANES_SR2           2
     219             : #define __LINK_MODE_LANES_SR4           4
     220             : #define __LINK_MODE_LANES_SR8           8
     221             : #define __LINK_MODE_LANES_ER            1
     222             : #define __LINK_MODE_LANES_KX            1
     223             : #define __LINK_MODE_LANES_KX4           4
     224             : #define __LINK_MODE_LANES_LR            1
     225             : #define __LINK_MODE_LANES_LR4           4
     226             : #define __LINK_MODE_LANES_LR4_ER4       4
     227             : #define __LINK_MODE_LANES_LR_ER_FR      1
     228             : #define __LINK_MODE_LANES_LR2_ER2_FR2   2
     229             : #define __LINK_MODE_LANES_LR4_ER4_FR4   4
     230             : #define __LINK_MODE_LANES_LR8_ER8_FR8   8
     231             : #define __LINK_MODE_LANES_LRM           1
     232             : #define __LINK_MODE_LANES_MLD2          2
     233             : #define __LINK_MODE_LANES_T             1
     234             : #define __LINK_MODE_LANES_T1            1
     235             : #define __LINK_MODE_LANES_X             1
     236             : #define __LINK_MODE_LANES_FX            1
     237             : 
     238             : #define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex)       \
     239             :         [ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = {         \
     240             :                 .speed  = SPEED_ ## _speed, \
     241             :                 .lanes  = __LINK_MODE_LANES_ ## _type, \
     242             :                 .duplex = __DUPLEX_ ## _duplex \
     243             :         }
     244             : #define __DUPLEX_Half DUPLEX_HALF
     245             : #define __DUPLEX_Full DUPLEX_FULL
     246             : #define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
     247             :         [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
     248             :                 .speed  = SPEED_UNKNOWN, \
     249             :                 .lanes  = 0, \
     250             :                 .duplex = DUPLEX_UNKNOWN, \
     251             :         }
     252             : 
     253             : const struct link_mode_info link_mode_params[] = {
     254             :         __DEFINE_LINK_MODE_PARAMS(10, T, Half),
     255             :         __DEFINE_LINK_MODE_PARAMS(10, T, Full),
     256             :         __DEFINE_LINK_MODE_PARAMS(100, T, Half),
     257             :         __DEFINE_LINK_MODE_PARAMS(100, T, Full),
     258             :         __DEFINE_LINK_MODE_PARAMS(1000, T, Half),
     259             :         __DEFINE_LINK_MODE_PARAMS(1000, T, Full),
     260             :         __DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
     261             :         __DEFINE_SPECIAL_MODE_PARAMS(TP),
     262             :         __DEFINE_SPECIAL_MODE_PARAMS(AUI),
     263             :         __DEFINE_SPECIAL_MODE_PARAMS(MII),
     264             :         __DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
     265             :         __DEFINE_SPECIAL_MODE_PARAMS(BNC),
     266             :         __DEFINE_LINK_MODE_PARAMS(10000, T, Full),
     267             :         __DEFINE_SPECIAL_MODE_PARAMS(Pause),
     268             :         __DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
     269             :         __DEFINE_LINK_MODE_PARAMS(2500, X, Full),
     270             :         __DEFINE_SPECIAL_MODE_PARAMS(Backplane),
     271             :         __DEFINE_LINK_MODE_PARAMS(1000, KX, Full),
     272             :         __DEFINE_LINK_MODE_PARAMS(10000, KX4, Full),
     273             :         __DEFINE_LINK_MODE_PARAMS(10000, KR, Full),
     274             :         [ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
     275             :                 .speed  = SPEED_10000,
     276             :                 .duplex = DUPLEX_FULL,
     277             :         },
     278             :         __DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full),
     279             :         __DEFINE_LINK_MODE_PARAMS(20000, KR2, Full),
     280             :         __DEFINE_LINK_MODE_PARAMS(40000, KR4, Full),
     281             :         __DEFINE_LINK_MODE_PARAMS(40000, CR4, Full),
     282             :         __DEFINE_LINK_MODE_PARAMS(40000, SR4, Full),
     283             :         __DEFINE_LINK_MODE_PARAMS(40000, LR4, Full),
     284             :         __DEFINE_LINK_MODE_PARAMS(56000, KR4, Full),
     285             :         __DEFINE_LINK_MODE_PARAMS(56000, CR4, Full),
     286             :         __DEFINE_LINK_MODE_PARAMS(56000, SR4, Full),
     287             :         __DEFINE_LINK_MODE_PARAMS(56000, LR4, Full),
     288             :         __DEFINE_LINK_MODE_PARAMS(25000, CR, Full),
     289             :         __DEFINE_LINK_MODE_PARAMS(25000, KR, Full),
     290             :         __DEFINE_LINK_MODE_PARAMS(25000, SR, Full),
     291             :         __DEFINE_LINK_MODE_PARAMS(50000, CR2, Full),
     292             :         __DEFINE_LINK_MODE_PARAMS(50000, KR2, Full),
     293             :         __DEFINE_LINK_MODE_PARAMS(100000, KR4, Full),
     294             :         __DEFINE_LINK_MODE_PARAMS(100000, SR4, Full),
     295             :         __DEFINE_LINK_MODE_PARAMS(100000, CR4, Full),
     296             :         __DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, Full),
     297             :         __DEFINE_LINK_MODE_PARAMS(50000, SR2, Full),
     298             :         __DEFINE_LINK_MODE_PARAMS(1000, X, Full),
     299             :         __DEFINE_LINK_MODE_PARAMS(10000, CR, Full),
     300             :         __DEFINE_LINK_MODE_PARAMS(10000, SR, Full),
     301             :         __DEFINE_LINK_MODE_PARAMS(10000, LR, Full),
     302             :         __DEFINE_LINK_MODE_PARAMS(10000, LRM, Full),
     303             :         __DEFINE_LINK_MODE_PARAMS(10000, ER, Full),
     304             :         __DEFINE_LINK_MODE_PARAMS(2500, T, Full),
     305             :         __DEFINE_LINK_MODE_PARAMS(5000, T, Full),
     306             :         __DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
     307             :         __DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
     308             :         __DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
     309             :         __DEFINE_LINK_MODE_PARAMS(50000, KR, Full),
     310             :         __DEFINE_LINK_MODE_PARAMS(50000, SR, Full),
     311             :         __DEFINE_LINK_MODE_PARAMS(50000, CR, Full),
     312             :         __DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, Full),
     313             :         __DEFINE_LINK_MODE_PARAMS(50000, DR, Full),
     314             :         __DEFINE_LINK_MODE_PARAMS(100000, KR2, Full),
     315             :         __DEFINE_LINK_MODE_PARAMS(100000, SR2, Full),
     316             :         __DEFINE_LINK_MODE_PARAMS(100000, CR2, Full),
     317             :         __DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, Full),
     318             :         __DEFINE_LINK_MODE_PARAMS(100000, DR2, Full),
     319             :         __DEFINE_LINK_MODE_PARAMS(200000, KR4, Full),
     320             :         __DEFINE_LINK_MODE_PARAMS(200000, SR4, Full),
     321             :         __DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, Full),
     322             :         __DEFINE_LINK_MODE_PARAMS(200000, DR4, Full),
     323             :         __DEFINE_LINK_MODE_PARAMS(200000, CR4, Full),
     324             :         __DEFINE_LINK_MODE_PARAMS(100, T1, Full),
     325             :         __DEFINE_LINK_MODE_PARAMS(1000, T1, Full),
     326             :         __DEFINE_LINK_MODE_PARAMS(400000, KR8, Full),
     327             :         __DEFINE_LINK_MODE_PARAMS(400000, SR8, Full),
     328             :         __DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, Full),
     329             :         __DEFINE_LINK_MODE_PARAMS(400000, DR8, Full),
     330             :         __DEFINE_LINK_MODE_PARAMS(400000, CR8, Full),
     331             :         __DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
     332             :         __DEFINE_LINK_MODE_PARAMS(100000, KR, Full),
     333             :         __DEFINE_LINK_MODE_PARAMS(100000, SR, Full),
     334             :         __DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, Full),
     335             :         __DEFINE_LINK_MODE_PARAMS(100000, DR, Full),
     336             :         __DEFINE_LINK_MODE_PARAMS(100000, CR, Full),
     337             :         __DEFINE_LINK_MODE_PARAMS(200000, KR2, Full),
     338             :         __DEFINE_LINK_MODE_PARAMS(200000, SR2, Full),
     339             :         __DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, Full),
     340             :         __DEFINE_LINK_MODE_PARAMS(200000, DR2, Full),
     341             :         __DEFINE_LINK_MODE_PARAMS(200000, CR2, Full),
     342             :         __DEFINE_LINK_MODE_PARAMS(400000, KR4, Full),
     343             :         __DEFINE_LINK_MODE_PARAMS(400000, SR4, Full),
     344             :         __DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, Full),
     345             :         __DEFINE_LINK_MODE_PARAMS(400000, DR4, Full),
     346             :         __DEFINE_LINK_MODE_PARAMS(400000, CR4, Full),
     347             :         __DEFINE_LINK_MODE_PARAMS(100, FX, Half),
     348             :         __DEFINE_LINK_MODE_PARAMS(100, FX, Full),
     349             : };
     350             : static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
     351             : 
     352             : const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
     353             :         [NETIF_MSG_DRV_BIT]             = "drv",
     354             :         [NETIF_MSG_PROBE_BIT]           = "probe",
     355             :         [NETIF_MSG_LINK_BIT]            = "link",
     356             :         [NETIF_MSG_TIMER_BIT]           = "timer",
     357             :         [NETIF_MSG_IFDOWN_BIT]          = "ifdown",
     358             :         [NETIF_MSG_IFUP_BIT]            = "ifup",
     359             :         [NETIF_MSG_RX_ERR_BIT]          = "rx_err",
     360             :         [NETIF_MSG_TX_ERR_BIT]          = "tx_err",
     361             :         [NETIF_MSG_TX_QUEUED_BIT]       = "tx_queued",
     362             :         [NETIF_MSG_INTR_BIT]            = "intr",
     363             :         [NETIF_MSG_TX_DONE_BIT]         = "tx_done",
     364             :         [NETIF_MSG_RX_STATUS_BIT]       = "rx_status",
     365             :         [NETIF_MSG_PKTDATA_BIT]         = "pktdata",
     366             :         [NETIF_MSG_HW_BIT]              = "hw",
     367             :         [NETIF_MSG_WOL_BIT]             = "wol",
     368             : };
     369             : static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
     370             : 
     371             : const char wol_mode_names[][ETH_GSTRING_LEN] = {
     372             :         [const_ilog2(WAKE_PHY)]         = "phy",
     373             :         [const_ilog2(WAKE_UCAST)]       = "ucast",
     374             :         [const_ilog2(WAKE_MCAST)]       = "mcast",
     375             :         [const_ilog2(WAKE_BCAST)]       = "bcast",
     376             :         [const_ilog2(WAKE_ARP)]         = "arp",
     377             :         [const_ilog2(WAKE_MAGIC)]       = "magic",
     378             :         [const_ilog2(WAKE_MAGICSECURE)] = "magicsecure",
     379             :         [const_ilog2(WAKE_FILTER)]      = "filter",
     380             : };
     381             : static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
     382             : 
     383             : const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
     384             :         [const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)]  = "hardware-transmit",
     385             :         [const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)]  = "software-transmit",
     386             :         [const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)]  = "hardware-receive",
     387             :         [const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)]  = "software-receive",
     388             :         [const_ilog2(SOF_TIMESTAMPING_SOFTWARE)]     = "software-system-clock",
     389             :         [const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
     390             :         [const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
     391             :         [const_ilog2(SOF_TIMESTAMPING_OPT_ID)]       = "option-id",
     392             :         [const_ilog2(SOF_TIMESTAMPING_TX_SCHED)]     = "sched-transmit",
     393             :         [const_ilog2(SOF_TIMESTAMPING_TX_ACK)]       = "ack-transmit",
     394             :         [const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)]     = "option-cmsg",
     395             :         [const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)]   = "option-tsonly",
     396             :         [const_ilog2(SOF_TIMESTAMPING_OPT_STATS)]    = "option-stats",
     397             :         [const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)]  = "option-pktinfo",
     398             :         [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)]  = "option-tx-swhw",
     399             : };
     400             : static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
     401             : 
     402             : const char ts_tx_type_names[][ETH_GSTRING_LEN] = {
     403             :         [HWTSTAMP_TX_OFF]               = "off",
     404             :         [HWTSTAMP_TX_ON]                = "on",
     405             :         [HWTSTAMP_TX_ONESTEP_SYNC]      = "onestep-sync",
     406             :         [HWTSTAMP_TX_ONESTEP_P2P]       = "onestep-p2p",
     407             : };
     408             : static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
     409             : 
     410             : const char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
     411             :         [HWTSTAMP_FILTER_NONE]                  = "none",
     412             :         [HWTSTAMP_FILTER_ALL]                   = "all",
     413             :         [HWTSTAMP_FILTER_SOME]                  = "some",
     414             :         [HWTSTAMP_FILTER_PTP_V1_L4_EVENT]       = "ptpv1-l4-event",
     415             :         [HWTSTAMP_FILTER_PTP_V1_L4_SYNC]        = "ptpv1-l4-sync",
     416             :         [HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ]   = "ptpv1-l4-delay-req",
     417             :         [HWTSTAMP_FILTER_PTP_V2_L4_EVENT]       = "ptpv2-l4-event",
     418             :         [HWTSTAMP_FILTER_PTP_V2_L4_SYNC]        = "ptpv2-l4-sync",
     419             :         [HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ]   = "ptpv2-l4-delay-req",
     420             :         [HWTSTAMP_FILTER_PTP_V2_L2_EVENT]       = "ptpv2-l2-event",
     421             :         [HWTSTAMP_FILTER_PTP_V2_L2_SYNC]        = "ptpv2-l2-sync",
     422             :         [HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ]   = "ptpv2-l2-delay-req",
     423             :         [HWTSTAMP_FILTER_PTP_V2_EVENT]          = "ptpv2-event",
     424             :         [HWTSTAMP_FILTER_PTP_V2_SYNC]           = "ptpv2-sync",
     425             :         [HWTSTAMP_FILTER_PTP_V2_DELAY_REQ]      = "ptpv2-delay-req",
     426             :         [HWTSTAMP_FILTER_NTP_ALL]               = "ntp-all",
     427             : };
     428             : static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
     429             : 
     430             : const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
     431             :         [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN]         = "vxlan",
     432             :         [ETHTOOL_UDP_TUNNEL_TYPE_GENEVE]        = "geneve",
     433             :         [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE]     = "vxlan-gpe",
     434             : };
     435             : static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
     436             :               __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
     437             : 
     438             : /* return false if legacy contained non-0 deprecated fields
     439             :  * maxtxpkt/maxrxpkt. rest of ksettings always updated
     440             :  */
     441             : bool
     442           0 : convert_legacy_settings_to_link_ksettings(
     443             :         struct ethtool_link_ksettings *link_ksettings,
     444             :         const struct ethtool_cmd *legacy_settings)
     445             : {
     446           0 :         bool retval = true;
     447             : 
     448           0 :         memset(link_ksettings, 0, sizeof(*link_ksettings));
     449             : 
     450             :         /* This is used to tell users that driver is still using these
     451             :          * deprecated legacy fields, and they should not use
     452             :          * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
     453             :          */
     454           0 :         if (legacy_settings->maxtxpkt ||
     455           0 :             legacy_settings->maxrxpkt)
     456           0 :                 retval = false;
     457             : 
     458           0 :         ethtool_convert_legacy_u32_to_link_mode(
     459           0 :                 link_ksettings->link_modes.supported,
     460             :                 legacy_settings->supported);
     461           0 :         ethtool_convert_legacy_u32_to_link_mode(
     462           0 :                 link_ksettings->link_modes.advertising,
     463             :                 legacy_settings->advertising);
     464           0 :         ethtool_convert_legacy_u32_to_link_mode(
     465           0 :                 link_ksettings->link_modes.lp_advertising,
     466             :                 legacy_settings->lp_advertising);
     467           0 :         link_ksettings->base.speed
     468           0 :                 = ethtool_cmd_speed(legacy_settings);
     469           0 :         link_ksettings->base.duplex
     470           0 :                 = legacy_settings->duplex;
     471           0 :         link_ksettings->base.port
     472           0 :                 = legacy_settings->port;
     473           0 :         link_ksettings->base.phy_address
     474           0 :                 = legacy_settings->phy_address;
     475           0 :         link_ksettings->base.autoneg
     476           0 :                 = legacy_settings->autoneg;
     477           0 :         link_ksettings->base.mdio_support
     478           0 :                 = legacy_settings->mdio_support;
     479           0 :         link_ksettings->base.eth_tp_mdix
     480           0 :                 = legacy_settings->eth_tp_mdix;
     481           0 :         link_ksettings->base.eth_tp_mdix_ctrl
     482           0 :                 = legacy_settings->eth_tp_mdix_ctrl;
     483           0 :         return retval;
     484             : }
     485             : 
     486           0 : int __ethtool_get_link(struct net_device *dev)
     487             : {
     488           0 :         if (!dev->ethtool_ops->get_link)
     489             :                 return -EOPNOTSUPP;
     490             : 
     491           0 :         return netif_running(dev) && dev->ethtool_ops->get_link(dev);
     492             : }
     493             : 
     494           0 : int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max)
     495             : {
     496           0 :         u32 dev_size, current_max = 0;
     497           0 :         u32 *indir;
     498           0 :         int ret;
     499             : 
     500           0 :         if (!dev->ethtool_ops->get_rxfh_indir_size ||
     501           0 :             !dev->ethtool_ops->get_rxfh)
     502             :                 return -EOPNOTSUPP;
     503           0 :         dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
     504           0 :         if (dev_size == 0)
     505             :                 return -EOPNOTSUPP;
     506             : 
     507           0 :         indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
     508           0 :         if (!indir)
     509             :                 return -ENOMEM;
     510             : 
     511           0 :         ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL);
     512           0 :         if (ret)
     513           0 :                 goto out;
     514             : 
     515           0 :         while (dev_size--)
     516           0 :                 current_max = max(current_max, indir[dev_size]);
     517             : 
     518           0 :         *max = current_max;
     519             : 
     520           0 : out:
     521           0 :         kfree(indir);
     522           0 :         return ret;
     523             : }
     524             : 
     525           2 : int ethtool_check_ops(const struct ethtool_ops *ops)
     526             : {
     527           4 :         if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
     528           0 :                 return -EINVAL;
     529             :         /* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
     530             :          * the fact that ops are checked at registration time does not
     531             :          * mean the ops attached to a netdev later on are sane.
     532             :          */
     533             :         return 0;
     534             : }
     535             : 
     536           0 : int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
     537             : {
     538           0 :         const struct ethtool_ops *ops = dev->ethtool_ops;
     539           0 :         struct phy_device *phydev = dev->phydev;
     540             : 
     541           0 :         memset(info, 0, sizeof(*info));
     542           0 :         info->cmd = ETHTOOL_GET_TS_INFO;
     543             : 
     544           0 :         if (phy_has_tsinfo(phydev))
     545           0 :                 return phy_ts_info(phydev, info);
     546           0 :         if (ops->get_ts_info)
     547           0 :                 return ops->get_ts_info(dev, info);
     548             : 
     549           0 :         info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
     550             :                                 SOF_TIMESTAMPING_SOFTWARE;
     551           0 :         info->phc_index = -1;
     552             : 
     553           0 :         return 0;
     554             : }
     555             : 
     556             : const struct ethtool_phy_ops *ethtool_phy_ops;
     557             : 
     558           0 : void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
     559             : {
     560           0 :         rtnl_lock();
     561           0 :         ethtool_phy_ops = ops;
     562           0 :         rtnl_unlock();
     563           0 : }
     564             : EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);

Generated by: LCOV version 1.14