From a8224734c8ab1eb2efe3a410165fb8d0ef4055e2 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Fri, 27 Dec 2019 15:55:18 +0100
Subject: [PATCH 161/283] ethtool: introduce ethtool netlink interface

mainline inclusion
from mainline-v5.6-rc1
commit 2b4a8990b7df55875745a80a609a1ceaaf51f322
category: feature
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN3D

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2b4a8990b7df55875745a80a609a1ceaaf51f322

--------------------------------

Basic genetlink and init infrastructure for the netlink interface, register
genetlink family "ethtool". Add CONFIG_ETHTOOL_NETLINK Kconfig option to
make the build optional. Add initial overall interface description into
Documentation/networking/ethtool-netlink.rst, further patches will add more
detailed information.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>

 Conflicts:
	Documentation/networking/ethtool-netlink.rst
	Documentation/networking/index.rst
---
 Documentation/networking/ethtool-netlink.rst | 1177 +-----------------
 Documentation/networking/index.rst           |   10 +-
 include/linux/ethtool_netlink.h              |    9 +
 include/uapi/linux/ethtool_netlink.h         |   36 +
 net/Kconfig                                  |    8 +
 net/ethtool/Makefile                         |    6 +-
 net/ethtool/netlink.c                        |   33 +
 net/ethtool/netlink.h                        |   10 +
 8 files changed, 152 insertions(+), 1137 deletions(-)
 create mode 100644 include/linux/ethtool_netlink.h
 create mode 100644 include/uapi/linux/ethtool_netlink.h
 create mode 100644 net/ethtool/netlink.c
 create mode 100644 net/ethtool/netlink.h

diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst
index f7b88ee9227d..fc550a3e82b1 100644
--- a/Documentation/networking/ethtool-netlink.rst
+++ b/Documentation/networking/ethtool-netlink.rst
@@ -68,7 +68,6 @@ the flags may not apply to requests. Recognized flags are:
   =================================  ===================================
   ``ETHTOOL_FLAG_COMPACT_BITSETS``   use compact format bitsets in reply
   ``ETHTOOL_FLAG_OMIT_REPLY``        omit optional reply (_SET and _ACT)
-  ``ETHTOOL_FLAG_STATS``             include optional device statistics
   =================================  ===================================
 
 New request flags should follow the general idea that if the flag is not set,
@@ -77,8 +76,6 @@ of the flag should be interpreted the way the client expects. A client must
 not set flags it does not understand.
 
 
-Bit sets
-========
 
 For short bitmaps of (reasonably) fixed length, standard ``NLA_BITFIELD32``
 type is used. For arbitrary length bitmaps, ethtool netlink uses a nested
@@ -161,6 +158,7 @@ determined by ``ETHTOOL_FLAG_COMPACT_BITSETS`` flag in flags field of request
 header. Semantics of value and mask depends on the attribute.
 
 
+=======
 List of message types
 =====================
 
@@ -177,73 +175,6 @@ according to message purpose:
   ``_NTF``          kernel notification
   ==============    ======================================
 
-Userspace to kernel:
-
-  ===================================== ================================
-  ``ETHTOOL_MSG_STRSET_GET``            get string set
-  ``ETHTOOL_MSG_LINKINFO_GET``          get link settings
-  ``ETHTOOL_MSG_LINKINFO_SET``          set link settings
-  ``ETHTOOL_MSG_LINKMODES_GET``         get link modes info
-  ``ETHTOOL_MSG_LINKMODES_SET``         set link modes info
-  ``ETHTOOL_MSG_LINKSTATE_GET``         get link state
-  ``ETHTOOL_MSG_DEBUG_GET``             get debugging settings
-  ``ETHTOOL_MSG_DEBUG_SET``             set debugging settings
-  ``ETHTOOL_MSG_WOL_GET``               get wake-on-lan settings
-  ``ETHTOOL_MSG_WOL_SET``               set wake-on-lan settings
-  ``ETHTOOL_MSG_FEATURES_GET``          get device features
-  ``ETHTOOL_MSG_FEATURES_SET``          set device features
-  ``ETHTOOL_MSG_PRIVFLAGS_GET``         get private flags
-  ``ETHTOOL_MSG_PRIVFLAGS_SET``         set private flags
-  ``ETHTOOL_MSG_RINGS_GET``             get ring sizes
-  ``ETHTOOL_MSG_RINGS_SET``             set ring sizes
-  ``ETHTOOL_MSG_CHANNELS_GET``          get channel counts
-  ``ETHTOOL_MSG_CHANNELS_SET``          set channel counts
-  ``ETHTOOL_MSG_COALESCE_GET``          get coalescing parameters
-  ``ETHTOOL_MSG_COALESCE_SET``          set coalescing parameters
-  ``ETHTOOL_MSG_PAUSE_GET``             get pause parameters
-  ``ETHTOOL_MSG_PAUSE_SET``             set pause parameters
-  ``ETHTOOL_MSG_EEE_GET``               get EEE settings
-  ``ETHTOOL_MSG_EEE_SET``               set EEE settings
-  ``ETHTOOL_MSG_TSINFO_GET``		get timestamping info
-  ``ETHTOOL_MSG_CABLE_TEST_ACT``        action start cable test
-  ``ETHTOOL_MSG_CABLE_TEST_TDR_ACT``    action start raw TDR cable test
-  ``ETHTOOL_MSG_TUNNEL_INFO_GET``       get tunnel offload info
-  ===================================== ================================
-
-Kernel to userspace:
-
-  ===================================== =================================
-  ``ETHTOOL_MSG_STRSET_GET_REPLY``      string set contents
-  ``ETHTOOL_MSG_LINKINFO_GET_REPLY``    link settings
-  ``ETHTOOL_MSG_LINKINFO_NTF``          link settings notification
-  ``ETHTOOL_MSG_LINKMODES_GET_REPLY``   link modes info
-  ``ETHTOOL_MSG_LINKMODES_NTF``         link modes notification
-  ``ETHTOOL_MSG_LINKSTATE_GET_REPLY``   link state info
-  ``ETHTOOL_MSG_DEBUG_GET_REPLY``       debugging settings
-  ``ETHTOOL_MSG_DEBUG_NTF``             debugging settings notification
-  ``ETHTOOL_MSG_WOL_GET_REPLY``         wake-on-lan settings
-  ``ETHTOOL_MSG_WOL_NTF``               wake-on-lan settings notification
-  ``ETHTOOL_MSG_FEATURES_GET_REPLY``    device features
-  ``ETHTOOL_MSG_FEATURES_SET_REPLY``    optional reply to FEATURES_SET
-  ``ETHTOOL_MSG_FEATURES_NTF``          netdev features notification
-  ``ETHTOOL_MSG_PRIVFLAGS_GET_REPLY``   private flags
-  ``ETHTOOL_MSG_PRIVFLAGS_NTF``         private flags
-  ``ETHTOOL_MSG_RINGS_GET_REPLY``       ring sizes
-  ``ETHTOOL_MSG_RINGS_NTF``             ring sizes
-  ``ETHTOOL_MSG_CHANNELS_GET_REPLY``    channel counts
-  ``ETHTOOL_MSG_CHANNELS_NTF``          channel counts
-  ``ETHTOOL_MSG_COALESCE_GET_REPLY``    coalescing parameters
-  ``ETHTOOL_MSG_COALESCE_NTF``          coalescing parameters
-  ``ETHTOOL_MSG_PAUSE_GET_REPLY``       pause parameters
-  ``ETHTOOL_MSG_PAUSE_NTF``             pause parameters
-  ``ETHTOOL_MSG_EEE_GET_REPLY``         EEE settings
-  ``ETHTOOL_MSG_EEE_NTF``               EEE settings
-  ``ETHTOOL_MSG_TSINFO_GET_REPLY``	timestamping info
-  ``ETHTOOL_MSG_CABLE_TEST_NTF``        Cable test results
-  ``ETHTOOL_MSG_CABLE_TEST_TDR_NTF``    Cable test TDR results
-  ``ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY`` tunnel offload info
-  ===================================== =================================
-
 ``GET`` requests are sent by userspace applications to retrieve device
 information. They usually do not contain any message specific attributes.
 Kernel replies with corresponding "GET_REPLY" message. For most types, ``GET``
@@ -275,1074 +206,59 @@ an ``ACT_REPLY`` message. Performing an action also triggers a notification
 Later sections describe the format and semantics of these messages.
 
 
-STRSET_GET
-==========
-
-Requests contents of a string set as provided by ioctl commands
-``ETHTOOL_GSSET_INFO`` and ``ETHTOOL_GSTRINGS.`` String sets are not user
-writeable so that the corresponding ``STRSET_SET`` message is only used in
-kernel replies. There are two types of string sets: global (independent of
-a device, e.g. device feature names) and device specific (e.g. device private
-flags).
-
-Request contents:
-
- +---------------------------------------+--------+------------------------+
- | ``ETHTOOL_A_STRSET_HEADER``           | nested | request header         |
- +---------------------------------------+--------+------------------------+
- | ``ETHTOOL_A_STRSET_STRINGSETS``       | nested | string set to request  |
- +-+-------------------------------------+--------+------------------------+
- | | ``ETHTOOL_A_STRINGSETS_STRINGSET+`` | nested | one string set         |
- +-+-+-----------------------------------+--------+------------------------+
- | | | ``ETHTOOL_A_STRINGSET_ID``        | u32    | set id                 |
- +-+-+-----------------------------------+--------+------------------------+
-
-Kernel response contents:
-
- +---------------------------------------+--------+-----------------------+
- | ``ETHTOOL_A_STRSET_HEADER``           | nested | reply header          |
- +---------------------------------------+--------+-----------------------+
- | ``ETHTOOL_A_STRSET_STRINGSETS``       | nested | array of string sets  |
- +-+-------------------------------------+--------+-----------------------+
- | | ``ETHTOOL_A_STRINGSETS_STRINGSET+`` | nested | one string set        |
- +-+-+-----------------------------------+--------+-----------------------+
- | | | ``ETHTOOL_A_STRINGSET_ID``        | u32    | set id                |
- +-+-+-----------------------------------+--------+-----------------------+
- | | | ``ETHTOOL_A_STRINGSET_COUNT``     | u32    | number of strings     |
- +-+-+-----------------------------------+--------+-----------------------+
- | | | ``ETHTOOL_A_STRINGSET_STRINGS``   | nested | array of strings      |
- +-+-+-+---------------------------------+--------+-----------------------+
- | | | | ``ETHTOOL_A_STRINGS_STRING+``   | nested | one string            |
- +-+-+-+-+-------------------------------+--------+-----------------------+
- | | | | | ``ETHTOOL_A_STRING_INDEX``    | u32    | string index          |
- +-+-+-+-+-------------------------------+--------+-----------------------+
- | | | | | ``ETHTOOL_A_STRING_VALUE``    | string | string value          |
- +-+-+-+-+-------------------------------+--------+-----------------------+
- | ``ETHTOOL_A_STRSET_COUNTS_ONLY``      | flag   | return only counts    |
- +---------------------------------------+--------+-----------------------+
-
-Device identification in request header is optional. Depending on its presence
-a and ``NLM_F_DUMP`` flag, there are three type of ``STRSET_GET`` requests:
-
- - no ``NLM_F_DUMP,`` no device: get "global" stringsets
- - no ``NLM_F_DUMP``, with device: get string sets related to the device
- - ``NLM_F_DUMP``, no device: get device related string sets for all devices
-
-If there is no ``ETHTOOL_A_STRSET_STRINGSETS`` array, all string sets of
-requested type are returned, otherwise only those specified in the request.
-Flag ``ETHTOOL_A_STRSET_COUNTS_ONLY`` tells kernel to only return string
-counts of the sets, not the actual strings.
-
-
-LINKINFO_GET
-============
-
-Requests link settings as provided by ``ETHTOOL_GLINKSETTINGS`` except for
-link modes and autonegotiation related information. The request does not use
-any attributes.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_LINKINFO_HEADER``         nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_LINKINFO_HEADER``         nested  reply header
-  ``ETHTOOL_A_LINKINFO_PORT``           u8      physical port
-  ``ETHTOOL_A_LINKINFO_PHYADDR``        u8      phy MDIO address
-  ``ETHTOOL_A_LINKINFO_TP_MDIX``        u8      MDI(-X) status
-  ``ETHTOOL_A_LINKINFO_TP_MDIX_CTRL``   u8      MDI(-X) control
-  ``ETHTOOL_A_LINKINFO_TRANSCEIVER``    u8      transceiver
-  ====================================  ======  ==========================
-
-Attributes and their values have the same meaning as matching members of the
-corresponding ioctl structures.
-
-``LINKINFO_GET`` allows dump requests (kernel returns reply message for all
-devices supporting the request).
-
-
-LINKINFO_SET
-============
-
-``LINKINFO_SET`` request allows setting some of the attributes reported by
-``LINKINFO_GET``.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_LINKINFO_HEADER``         nested  request header
-  ``ETHTOOL_A_LINKINFO_PORT``           u8      physical port
-  ``ETHTOOL_A_LINKINFO_PHYADDR``        u8      phy MDIO address
-  ``ETHTOOL_A_LINKINFO_TP_MDIX_CTRL``   u8      MDI(-X) control
-  ====================================  ======  ==========================
-
-MDI(-X) status and transceiver cannot be set, request with the corresponding
-attributes is rejected.
-
-
-LINKMODES_GET
-=============
-
-Requests link modes (supported, advertised and peer advertised) and related
-information (autonegotiation status, link speed and duplex) as provided by
-``ETHTOOL_GLINKSETTINGS``. The request does not use any attributes.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_LINKMODES_HEADER``        nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ==========================================  ======  ==========================
-  ``ETHTOOL_A_LINKMODES_HEADER``              nested  reply header
-  ``ETHTOOL_A_LINKMODES_AUTONEG``             u8      autonegotiation status
-  ``ETHTOOL_A_LINKMODES_OURS``                bitset  advertised link modes
-  ``ETHTOOL_A_LINKMODES_PEER``                bitset  partner link modes
-  ``ETHTOOL_A_LINKMODES_SPEED``               u32     link speed (Mb/s)
-  ``ETHTOOL_A_LINKMODES_DUPLEX``              u8      duplex mode
-  ``ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG``    u8      Master/slave port mode
-  ``ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE``  u8      Master/slave port state
-  ==========================================  ======  ==========================
-
-For ``ETHTOOL_A_LINKMODES_OURS``, value represents advertised modes and mask
-represents supported modes. ``ETHTOOL_A_LINKMODES_PEER`` in the reply is a bit
-list.
-
-``LINKMODES_GET`` allows dump requests (kernel returns reply messages for all
-devices supporting the request).
-
-
-LINKMODES_SET
-=============
-
-Request contents:
-
-  ==========================================  ======  ==========================
-  ``ETHTOOL_A_LINKMODES_HEADER``              nested  request header
-  ``ETHTOOL_A_LINKMODES_AUTONEG``             u8      autonegotiation status
-  ``ETHTOOL_A_LINKMODES_OURS``                bitset  advertised link modes
-  ``ETHTOOL_A_LINKMODES_PEER``                bitset  partner link modes
-  ``ETHTOOL_A_LINKMODES_SPEED``               u32     link speed (Mb/s)
-  ``ETHTOOL_A_LINKMODES_DUPLEX``              u8      duplex mode
-  ``ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG``    u8      Master/slave port mode
-  ==========================================  ======  ==========================
-
-``ETHTOOL_A_LINKMODES_OURS`` bit set allows setting advertised link modes. If
-autonegotiation is on (either set now or kept from before), advertised modes
-are not changed (no ``ETHTOOL_A_LINKMODES_OURS`` attribute) and at least one
-of speed and duplex is specified, kernel adjusts advertised modes to all
-supported modes matching speed, duplex or both (whatever is specified). This
-autoselection is done on ethtool side with ioctl interface, netlink interface
-is supposed to allow requesting changes without knowing what exactly kernel
-supports.
-
-
-LINKSTATE_GET
-=============
-
-Requests link state information. Link up/down flag (as provided by
-``ETHTOOL_GLINK`` ioctl command) is provided. Optionally, extended state might
-be provided as well. In general, extended state describes reasons for why a port
-is down, or why it operates in some non-obvious mode. This request does not have
-any attributes.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_LINKSTATE_HEADER``        nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ============================
-  ``ETHTOOL_A_LINKSTATE_HEADER``        nested  reply header
-  ``ETHTOOL_A_LINKSTATE_LINK``          bool    link state (up/down)
-  ``ETHTOOL_A_LINKSTATE_SQI``           u32     Current Signal Quality Index
-  ``ETHTOOL_A_LINKSTATE_SQI_MAX``       u32     Max support SQI value
-  ``ETHTOOL_A_LINKSTATE_EXT_STATE``     u8      link extended state
-  ``ETHTOOL_A_LINKSTATE_EXT_SUBSTATE``  u8      link extended substate
-  ====================================  ======  ============================
-
-For most NIC drivers, the value of ``ETHTOOL_A_LINKSTATE_LINK`` returns
-carrier flag provided by ``netif_carrier_ok()`` but there are drivers which
-define their own handler.
-
-``ETHTOOL_A_LINKSTATE_EXT_STATE`` and ``ETHTOOL_A_LINKSTATE_EXT_SUBSTATE`` are
-optional values. ethtool core can provide either both
-``ETHTOOL_A_LINKSTATE_EXT_STATE`` and ``ETHTOOL_A_LINKSTATE_EXT_SUBSTATE``,
-or only ``ETHTOOL_A_LINKSTATE_EXT_STATE``, or none of them.
-
-``LINKSTATE_GET`` allows dump requests (kernel returns reply messages for all
-devices supporting the request).
-
-
-Link extended states:
-
-  ================================================      ============================================
-  ``ETHTOOL_LINK_EXT_STATE_AUTONEG``                    States relating to the autonegotiation or
-                                                        issues therein
-
-  ``ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE``      Failure during link training
-
-  ``ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH``      Logical mismatch in physical coding sublayer
-                                                        or forward error correction sublayer
-
-  ``ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY``       Signal integrity issues
-
-  ``ETHTOOL_LINK_EXT_STATE_NO_CABLE``                   No cable connected
-
-  ``ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE``                Failure is related to cable,
-                                                        e.g., unsupported cable
-
-  ``ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE``               Failure is related to EEPROM, e.g., failure
-                                                        during reading or parsing the data
-
-  ``ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE``        Failure during calibration algorithm
-
-  ``ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED``      The hardware is not able to provide the
-                                                        power required from cable or module
-
-  ``ETHTOOL_LINK_EXT_STATE_OVERHEAT``                   The module is overheated
-  ================================================      ============================================
-
-Link extended substates:
-
-  Autoneg substates:
-
-  ===============================================================   ================================
-  ``ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED``              Peer side is down
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED``                 Ack not received from peer side
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED``        Next page exchange failed
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE``   Peer side is down during force
-                                                                    mode or there is no agreement of
-                                                                    speed
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE``     Forward error correction modes
-                                                                    in both sides are mismatched
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD``                           No Highest Common Denominator
-  ===============================================================   ================================
-
-  Link training substates:
-
-  ===========================================================================   ====================
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED``                    Frames were not
-                                                                                 recognized, the
-                                                                                 lock failed
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT``                       The lock did not
-                                                                                 occur before
-                                                                                 timeout
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY``    Peer side did not
-                                                                                 send ready signal
-                                                                                 after training
-                                                                                 process
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT``                                  Remote side is not
-                                                                                 ready yet
-  ===========================================================================   ====================
-
-  Link logical mismatch substates:
-
-  ================================================================   ===============================
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK``   Physical coding sublayer was
-                                                                     not locked in first phase -
-                                                                     block lock
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK``      Physical coding sublayer was
-                                                                     not locked in second phase -
-                                                                     alignment markers lock
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS``     Physical coding sublayer did
-                                                                     not get align status
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED``             FC forward error correction is
-                                                                     not locked
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED``             RS forward error correction is
-                                                                     not locked
-  ================================================================   ===============================
-
-  Bad signal integrity substates:
-
-  =================================================================    =============================
-  ``ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS``    Large number of physical
-                                                                       errors
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE``                   The system attempted to
-                                                                       operate the cable at a rate
-                                                                       that is not formally
-                                                                       supported, which led to
-                                                                       signal integrity issues
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST``        The external clock signal for
-                                                                       SerDes is too weak or
-                                                                       unavailable.
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS``                        The received signal for
-                                                                       SerDes is too weak because
-                                                                       analog loss of signal.
-  =================================================================    =============================
-
-  Cable issue substates:
-
-  ===================================================   ============================================
-  ``ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE``    Unsupported cable
-
-  ``ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE``   Cable test failure
-  ===================================================   ============================================
-
-DEBUG_GET
-=========
-
-Requests debugging settings of a device. At the moment, only message mask is
-provided.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_DEBUG_HEADER``            nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_DEBUG_HEADER``            nested  reply header
-  ``ETHTOOL_A_DEBUG_MSGMASK``           bitset  message mask
-  ====================================  ======  ==========================
-
-The message mask (``ETHTOOL_A_DEBUG_MSGMASK``) is equal to message level as
-provided by ``ETHTOOL_GMSGLVL`` and set by ``ETHTOOL_SMSGLVL`` in ioctl
-interface. While it is called message level there for historical reasons, most
-drivers and almost all newer drivers use it as a mask of enabled message
-classes (represented by ``NETIF_MSG_*`` constants); therefore netlink
-interface follows its actual use in practice.
-
-``DEBUG_GET`` allows dump requests (kernel returns reply messages for all
-devices supporting the request).
-
-
-DEBUG_SET
-=========
-
-Set or update debugging settings of a device. At the moment, only message mask
-is supported.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_DEBUG_HEADER``            nested  request header
-  ``ETHTOOL_A_DEBUG_MSGMASK``           bitset  message mask
-  ====================================  ======  ==========================
-
-``ETHTOOL_A_DEBUG_MSGMASK`` bit set allows setting or modifying mask of
-enabled debugging message types for the device.
-
-
-WOL_GET
-=======
-
-Query device wake-on-lan settings. Unlike most "GET" type requests,
-``ETHTOOL_MSG_WOL_GET`` requires (netns) ``CAP_NET_ADMIN`` privileges as it
-(potentially) provides SecureOn(tm) password which is confidential.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_WOL_HEADER``              nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_WOL_HEADER``              nested  reply header
-  ``ETHTOOL_A_WOL_MODES``               bitset  mask of enabled WoL modes
-  ``ETHTOOL_A_WOL_SOPASS``              binary  SecureOn(tm) password
-  ====================================  ======  ==========================
-
-In reply, ``ETHTOOL_A_WOL_MODES`` mask consists of modes supported by the
-device, value of modes which are enabled. ``ETHTOOL_A_WOL_SOPASS`` is only
-included in reply if ``WAKE_MAGICSECURE`` mode is supported.
-
-
-WOL_SET
-=======
-
-Set or update wake-on-lan settings.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_WOL_HEADER``              nested  request header
-  ``ETHTOOL_A_WOL_MODES``               bitset  enabled WoL modes
-  ``ETHTOOL_A_WOL_SOPASS``              binary  SecureOn(tm) password
-  ====================================  ======  ==========================
-
-``ETHTOOL_A_WOL_SOPASS`` is only allowed for devices supporting
-``WAKE_MAGICSECURE`` mode.
-
-
-FEATURES_GET
-============
-
-Gets netdev features like ``ETHTOOL_GFEATURES`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_FEATURES_HEADER``         nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_FEATURES_HEADER``         nested  reply header
-  ``ETHTOOL_A_FEATURES_HW``             bitset  dev->hw_features
-  ``ETHTOOL_A_FEATURES_WANTED``         bitset  dev->wanted_features
-  ``ETHTOOL_A_FEATURES_ACTIVE``         bitset  dev->features
-  ``ETHTOOL_A_FEATURES_NOCHANGE``       bitset  NETIF_F_NEVER_CHANGE
-  ====================================  ======  ==========================
-
-Bitmaps in kernel response have the same meaning as bitmaps used in ioctl
-interference but attribute names are different (they are based on
-corresponding members of struct net_device). Legacy "flags" are not provided,
-if userspace needs them (most likely only ethtool for backward compatibility),
-it can calculate their values from related feature bits itself.
-ETHA_FEATURES_HW uses mask consisting of all features recognized by kernel (to
-provide all names when using verbose bitmap format), the other three use no
-mask (simple bit lists).
-
-
-FEATURES_SET
-============
-
-Request to set netdev features like ``ETHTOOL_SFEATURES`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_FEATURES_HEADER``         nested  request header
-  ``ETHTOOL_A_FEATURES_WANTED``         bitset  requested features
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_FEATURES_HEADER``         nested  reply header
-  ``ETHTOOL_A_FEATURES_WANTED``         bitset  diff wanted vs. result
-  ``ETHTOOL_A_FEATURES_ACTIVE``         bitset  diff old vs. new active
-  ====================================  ======  ==========================
-
-Request constains only one bitset which can be either value/mask pair (request
-to change specific feature bits and leave the rest) or only a value (request
-to set all features to specified set).
-
-As request is subject to netdev_change_features() sanity checks, optional
-kernel reply (can be suppressed by ``ETHTOOL_FLAG_OMIT_REPLY`` flag in request
-header) informs client about the actual result. ``ETHTOOL_A_FEATURES_WANTED``
-reports the difference between client request and actual result: mask consists
-of bits which differ between requested features and result (dev->features
-after the operation), value consists of values of these bits in the request
-(i.e. negated values from resulting features). ``ETHTOOL_A_FEATURES_ACTIVE``
-reports the difference between old and new dev->features: mask consists of
-bits which have changed, values are their values in new dev->features (after
-the operation).
-
-``ETHTOOL_MSG_FEATURES_NTF`` notification is sent not only if device features
-are modified using ``ETHTOOL_MSG_FEATURES_SET`` request or on of ethtool ioctl
-request but also each time features are modified with netdev_update_features()
-or netdev_change_features().
-
-
-PRIVFLAGS_GET
-=============
-
-Gets private flags like ``ETHTOOL_GPFLAGS`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_PRIVFLAGS_HEADER``        nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_PRIVFLAGS_HEADER``        nested  reply header
-  ``ETHTOOL_A_PRIVFLAGS_FLAGS``         bitset  private flags
-  ====================================  ======  ==========================
-
-``ETHTOOL_A_PRIVFLAGS_FLAGS`` is a bitset with values of device private flags.
-These flags are defined by driver, their number and names (and also meaning)
-are device dependent. For compact bitset format, names can be retrieved as
-``ETH_SS_PRIV_FLAGS`` string set. If verbose bitset format is requested,
-response uses all private flags supported by the device as mask so that client
-gets the full information without having to fetch the string set with names.
-
-
-PRIVFLAGS_SET
-=============
-
-Sets or modifies values of device private flags like ``ETHTOOL_SPFLAGS``
-ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_PRIVFLAGS_HEADER``        nested  request header
-  ``ETHTOOL_A_PRIVFLAGS_FLAGS``         bitset  private flags
-  ====================================  ======  ==========================
-
-``ETHTOOL_A_PRIVFLAGS_FLAGS`` can either set the whole set of private flags or
-modify only values of some of them.
-
-
-RINGS_GET
-=========
-
-Gets ring sizes like ``ETHTOOL_GRINGPARAM`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_RINGS_HEADER``            nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_RINGS_HEADER``            nested  reply header
-  ``ETHTOOL_A_RINGS_RX_MAX``            u32     max size of RX ring
-  ``ETHTOOL_A_RINGS_RX_MINI_MAX``       u32     max size of RX mini ring
-  ``ETHTOOL_A_RINGS_RX_JUMBO_MAX``      u32     max size of RX jumbo ring
-  ``ETHTOOL_A_RINGS_TX_MAX``            u32     max size of TX ring
-  ``ETHTOOL_A_RINGS_RX``                u32     size of RX ring
-  ``ETHTOOL_A_RINGS_RX_MINI``           u32     size of RX mini ring
-  ``ETHTOOL_A_RINGS_RX_JUMBO``          u32     size of RX jumbo ring
-  ``ETHTOOL_A_RINGS_TX``                u32     size of TX ring
-  ====================================  ======  ==========================
-
-
-RINGS_SET
-=========
-
-Sets ring sizes like ``ETHTOOL_SRINGPARAM`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_RINGS_HEADER``            nested  reply header
-  ``ETHTOOL_A_RINGS_RX``                u32     size of RX ring
-  ``ETHTOOL_A_RINGS_RX_MINI``           u32     size of RX mini ring
-  ``ETHTOOL_A_RINGS_RX_JUMBO``          u32     size of RX jumbo ring
-  ``ETHTOOL_A_RINGS_TX``                u32     size of TX ring
-  ====================================  ======  ==========================
-
-Kernel checks that requested ring sizes do not exceed limits reported by
-driver. Driver may impose additional constraints and may not suspport all
-attributes.
-
-
-CHANNELS_GET
-============
-
-Gets channel counts like ``ETHTOOL_GCHANNELS`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_CHANNELS_HEADER``         nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_CHANNELS_HEADER``          nested  reply header
-  ``ETHTOOL_A_CHANNELS_RX_MAX``          u32     max receive channels
-  ``ETHTOOL_A_CHANNELS_TX_MAX``          u32     max transmit channels
-  ``ETHTOOL_A_CHANNELS_OTHER_MAX``       u32     max other channels
-  ``ETHTOOL_A_CHANNELS_COMBINED_MAX``    u32     max combined channels
-  ``ETHTOOL_A_CHANNELS_RX_COUNT``        u32     receive channel count
-  ``ETHTOOL_A_CHANNELS_TX_COUNT``        u32     transmit channel count
-  ``ETHTOOL_A_CHANNELS_OTHER_COUNT``     u32     other channel count
-  ``ETHTOOL_A_CHANNELS_COMBINED_COUNT``  u32     combined channel count
-  =====================================  ======  ==========================
-
-
-CHANNELS_SET
-============
-
-Sets channel counts like ``ETHTOOL_SCHANNELS`` ioctl request.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_CHANNELS_HEADER``          nested  request header
-  ``ETHTOOL_A_CHANNELS_RX_COUNT``        u32     receive channel count
-  ``ETHTOOL_A_CHANNELS_TX_COUNT``        u32     transmit channel count
-  ``ETHTOOL_A_CHANNELS_OTHER_COUNT``     u32     other channel count
-  ``ETHTOOL_A_CHANNELS_COMBINED_COUNT``  u32     combined channel count
-  =====================================  ======  ==========================
-
-Kernel checks that requested channel counts do not exceed limits reported by
-driver. Driver may impose additional constraints and may not suspport all
-attributes.
-
-
-COALESCE_GET
-============
-
-Gets coalescing parameters like ``ETHTOOL_GCOALESCE`` ioctl request.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_COALESCE_HEADER``         nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ===========================================  ======  =======================
-  ``ETHTOOL_A_COALESCE_HEADER``                nested  reply header
-  ``ETHTOOL_A_COALESCE_RX_USECS``              u32     delay (us), normal Rx
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES``         u32     max packets, normal Rx
-  ``ETHTOOL_A_COALESCE_RX_USECS_IRQ``          u32     delay (us), Rx in IRQ
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ``     u32     max packets, Rx in IRQ
-  ``ETHTOOL_A_COALESCE_TX_USECS``              u32     delay (us), normal Tx
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES``         u32     max packets, normal Tx
-  ``ETHTOOL_A_COALESCE_TX_USECS_IRQ``          u32     delay (us), Tx in IRQ
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ``     u32     IRQ packets, Tx in IRQ
-  ``ETHTOOL_A_COALESCE_STATS_BLOCK_USECS``     u32     delay of stats update
-  ``ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX``       bool    adaptive Rx coalesce
-  ``ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX``       bool    adaptive Tx coalesce
-  ``ETHTOOL_A_COALESCE_PKT_RATE_LOW``          u32     threshold for low rate
-  ``ETHTOOL_A_COALESCE_RX_USECS_LOW``          u32     delay (us), low Rx
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW``     u32     max packets, low Rx
-  ``ETHTOOL_A_COALESCE_TX_USECS_LOW``          u32     delay (us), low Tx
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW``     u32     max packets, low Tx
-  ``ETHTOOL_A_COALESCE_PKT_RATE_HIGH``         u32     threshold for high rate
-  ``ETHTOOL_A_COALESCE_RX_USECS_HIGH``         u32     delay (us), high Rx
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH``    u32     max packets, high Rx
-  ``ETHTOOL_A_COALESCE_TX_USECS_HIGH``         u32     delay (us), high Tx
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH``    u32     max packets, high Tx
-  ``ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL``  u32     rate sampling interval
-  ===========================================  ======  =======================
-
-Attributes are only included in reply if their value is not zero or the
-corresponding bit in ``ethtool_ops::supported_coalesce_params`` is set (i.e.
-they are declared as supported by driver).
-
-
-COALESCE_SET
-============
-
-Sets coalescing parameters like ``ETHTOOL_SCOALESCE`` ioctl request.
-
-Request contents:
-
-  ===========================================  ======  =======================
-  ``ETHTOOL_A_COALESCE_HEADER``                nested  request header
-  ``ETHTOOL_A_COALESCE_RX_USECS``              u32     delay (us), normal Rx
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES``         u32     max packets, normal Rx
-  ``ETHTOOL_A_COALESCE_RX_USECS_IRQ``          u32     delay (us), Rx in IRQ
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ``     u32     max packets, Rx in IRQ
-  ``ETHTOOL_A_COALESCE_TX_USECS``              u32     delay (us), normal Tx
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES``         u32     max packets, normal Tx
-  ``ETHTOOL_A_COALESCE_TX_USECS_IRQ``          u32     delay (us), Tx in IRQ
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ``     u32     IRQ packets, Tx in IRQ
-  ``ETHTOOL_A_COALESCE_STATS_BLOCK_USECS``     u32     delay of stats update
-  ``ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX``       bool    adaptive Rx coalesce
-  ``ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX``       bool    adaptive Tx coalesce
-  ``ETHTOOL_A_COALESCE_PKT_RATE_LOW``          u32     threshold for low rate
-  ``ETHTOOL_A_COALESCE_RX_USECS_LOW``          u32     delay (us), low Rx
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW``     u32     max packets, low Rx
-  ``ETHTOOL_A_COALESCE_TX_USECS_LOW``          u32     delay (us), low Tx
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW``     u32     max packets, low Tx
-  ``ETHTOOL_A_COALESCE_PKT_RATE_HIGH``         u32     threshold for high rate
-  ``ETHTOOL_A_COALESCE_RX_USECS_HIGH``         u32     delay (us), high Rx
-  ``ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH``    u32     max packets, high Rx
-  ``ETHTOOL_A_COALESCE_TX_USECS_HIGH``         u32     delay (us), high Tx
-  ``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH``    u32     max packets, high Tx
-  ``ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL``  u32     rate sampling interval
-  ===========================================  ======  =======================
-
-Request is rejected if it attributes declared as unsupported by driver (i.e.
-such that the corresponding bit in ``ethtool_ops::supported_coalesce_params``
-is not set), regardless of their values. Driver may impose additional
-constraints on coalescing parameters and their values.
-
-
-PAUSE_GET
-============
-
-Gets channel counts like ``ETHTOOL_GPAUSE`` ioctl request.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_PAUSE_HEADER``             nested  request header
-  =====================================  ======  ==========================
-
-Kernel response contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_PAUSE_HEADER``             nested  request header
-  ``ETHTOOL_A_PAUSE_AUTONEG``            bool    pause autonegotiation
-  ``ETHTOOL_A_PAUSE_RX``                 bool    receive pause frames
-  ``ETHTOOL_A_PAUSE_TX``                 bool    transmit pause frames
-  ``ETHTOOL_A_PAUSE_STATS``              nested  pause statistics
-  =====================================  ======  ==========================
-
-``ETHTOOL_A_PAUSE_STATS`` are reported if ``ETHTOOL_FLAG_STATS`` was set
-in ``ETHTOOL_A_HEADER_FLAGS``.
-It will be empty if driver did not report any statistics. Drivers fill in
-the statistics in the following structure:
-
-.. kernel-doc:: include/linux/ethtool.h
-    :identifiers: ethtool_pause_stats
-
-Each member has a corresponding attribute defined.
-
-PAUSE_SET
-============
-
-Sets pause parameters like ``ETHTOOL_GPAUSEPARAM`` ioctl request.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_PAUSE_HEADER``             nested  request header
-  ``ETHTOOL_A_PAUSE_AUTONEG``            bool    pause autonegotiation
-  ``ETHTOOL_A_PAUSE_RX``                 bool    receive pause frames
-  ``ETHTOOL_A_PAUSE_TX``                 bool    transmit pause frames
-  =====================================  ======  ==========================
-
-
-EEE_GET
-=======
-
-Gets channel counts like ``ETHTOOL_GEEE`` ioctl request.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_EEE_HEADER``               nested  request header
-  =====================================  ======  ==========================
-
-Kernel response contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_EEE_HEADER``               nested  request header
-  ``ETHTOOL_A_EEE_MODES_OURS``           bool    supported/advertised modes
-  ``ETHTOOL_A_EEE_MODES_PEER``           bool    peer advertised link modes
-  ``ETHTOOL_A_EEE_ACTIVE``               bool    EEE is actively used
-  ``ETHTOOL_A_EEE_ENABLED``              bool    EEE is enabled
-  ``ETHTOOL_A_EEE_TX_LPI_ENABLED``       bool    Tx lpi enabled
-  ``ETHTOOL_A_EEE_TX_LPI_TIMER``         u32     Tx lpi timeout (in us)
-  =====================================  ======  ==========================
-
-In ``ETHTOOL_A_EEE_MODES_OURS``, mask consists of link modes for which EEE is
-enabled, value of link modes for which EEE is advertised. Link modes for which
-peer advertises EEE are listed in ``ETHTOOL_A_EEE_MODES_PEER`` (no mask). The
-netlink interface allows reporting EEE status for all link modes but only
-first 32 are provided by the ``ethtool_ops`` callback.
-
-
-EEE_SET
-=======
-
-Sets pause parameters like ``ETHTOOL_GEEEPARAM`` ioctl request.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_EEE_HEADER``               nested  request header
-  ``ETHTOOL_A_EEE_MODES_OURS``           bool    advertised modes
-  ``ETHTOOL_A_EEE_ENABLED``              bool    EEE is enabled
-  ``ETHTOOL_A_EEE_TX_LPI_ENABLED``       bool    Tx lpi enabled
-  ``ETHTOOL_A_EEE_TX_LPI_TIMER``         u32     Tx lpi timeout (in us)
-  =====================================  ======  ==========================
-
-``ETHTOOL_A_EEE_MODES_OURS`` is used to either list link modes to advertise
-EEE for (if there is no mask) or specify changes to the list (if there is
-a mask). The netlink interface allows reporting EEE status for all link modes
-but only first 32 can be set at the moment as that is what the ``ethtool_ops``
-callback supports.
-
-
-TSINFO_GET
-==========
-
-Gets timestamping information like ``ETHTOOL_GET_TS_INFO`` ioctl request.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_TSINFO_HEADER``            nested  request header
-  =====================================  ======  ==========================
-
-Kernel response contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_TSINFO_HEADER``            nested  request header
-  ``ETHTOOL_A_TSINFO_TIMESTAMPING``      bitset  SO_TIMESTAMPING flags
-  ``ETHTOOL_A_TSINFO_TX_TYPES``          bitset  supported Tx types
-  ``ETHTOOL_A_TSINFO_RX_FILTERS``        bitset  supported Rx filters
-  ``ETHTOOL_A_TSINFO_PHC_INDEX``         u32     PTP hw clock index
-  =====================================  ======  ==========================
-
-``ETHTOOL_A_TSINFO_PHC_INDEX`` is absent if there is no associated PHC (there
-is no special value for this case). The bitset attributes are omitted if they
-would be empty (no bit set).
-
-CABLE_TEST
-==========
-
-Start a cable test.
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_CABLE_TEST_HEADER``       nested  request header
-  ====================================  ======  ==========================
-
-Notification contents:
-
-An Ethernet cable typically contains 1, 2 or 4 pairs. The length of
-the pair can only be measured when there is a fault in the pair and
-hence a reflection. Information about the fault may not be available,
-depending on the specific hardware. Hence the contents of the notify
-message are mostly optional. The attributes can be repeated an
-arbitrary number of times, in an arbitrary order, for an arbitrary
-number of pairs.
-
-The example shows the notification sent when the test is completed for
-a T2 cable, i.e. two pairs. One pair is OK and hence has no length
-information. The second pair has a fault and does have length
-information.
-
- +---------------------------------------------+--------+---------------------+
- | ``ETHTOOL_A_CABLE_TEST_HEADER``             | nested | reply header        |
- +---------------------------------------------+--------+---------------------+
- | ``ETHTOOL_A_CABLE_TEST_STATUS``             | u8     | completed           |
- +---------------------------------------------+--------+---------------------+
- | ``ETHTOOL_A_CABLE_TEST_NTF_NEST``           | nested | all the results     |
- +-+-------------------------------------------+--------+---------------------+
- | | ``ETHTOOL_A_CABLE_NEST_RESULT``           | nested | cable test result   |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_PAIR``        | u8     | pair number         |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_CODE``        | u8     | result code         |
- +-+-+-----------------------------------------+--------+---------------------+
- | | ``ETHTOOL_A_CABLE_NEST_RESULT``           | nested | cable test results  |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_PAIR``        | u8     | pair number         |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_CODE``        | u8     | result code         |
- +-+-+-----------------------------------------+--------+---------------------+
- | | ``ETHTOOL_A_CABLE_NEST_FAULT_LENGTH``     | nested | cable length        |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR``   | u8     | pair number         |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_CABLE_FAULT_LENGTH_CM``     | u32    | length in cm        |
- +-+-+-----------------------------------------+--------+---------------------+
-
-CABLE_TEST TDR
-==============
-
-Start a cable test and report raw TDR data
-
-Request contents:
-
- +--------------------------------------------+--------+-----------------------+
- | ``ETHTOOL_A_CABLE_TEST_TDR_HEADER``        | nested | reply header          |
- +--------------------------------------------+--------+-----------------------+
- | ``ETHTOOL_A_CABLE_TEST_TDR_CFG``           | nested | test configuration    |
- +-+------------------------------------------+--------+-----------------------+
- | | ``ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE``  | u32    | first data distance   |
- +-+-+----------------------------------------+--------+-----------------------+
- | | ``ETHTOOL_A_CABLE_STEP_LAST_DISTANCE``   | u32    | last data distance    |
- +-+-+----------------------------------------+--------+-----------------------+
- | | ``ETHTOOL_A_CABLE_STEP_STEP_DISTANCE``   | u32    | distance of each step |
- +-+-+----------------------------------------+--------+-----------------------+
- | | ``ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR``    | u8     | pair to test          |
- +-+-+----------------------------------------+--------+-----------------------+
-
-The ETHTOOL_A_CABLE_TEST_TDR_CFG is optional, as well as all members
-of the nest. All distances are expressed in centimeters. The PHY takes
-the distances as a guide, and rounds to the nearest distance it
-actually supports. If a pair is passed, only that one pair will be
-tested. Otherwise all pairs are tested.
-
-Notification contents:
-
-Raw TDR data is gathered by sending a pulse down the cable and
-recording the amplitude of the reflected pulse for a given distance.
-
-It can take a number of seconds to collect TDR data, especial if the
-full 100 meters is probed at 1 meter intervals. When the test is
-started a notification will be sent containing just
-ETHTOOL_A_CABLE_TEST_TDR_STATUS with the value
-ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED.
-
-When the test has completed a second notification will be sent
-containing ETHTOOL_A_CABLE_TEST_TDR_STATUS with the value
-ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED and the TDR data.
-
-The message may optionally contain the amplitude of the pulse send
-down the cable. This is measured in mV. A reflection should not be
-bigger than transmitted pulse.
-
-Before the raw TDR data should be an ETHTOOL_A_CABLE_TDR_NEST_STEP
-nest containing information about the distance along the cable for the
-first reading, the last reading, and the step between each
-reading. Distances are measured in centimeters. These should be the
-exact values the PHY used. These may be different to what the user
-requested, if the native measurement resolution is greater than 1 cm.
-
-For each step along the cable, a ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE is
-used to report the amplitude of the reflection for a given pair.
-
- +---------------------------------------------+--------+----------------------+
- | ``ETHTOOL_A_CABLE_TEST_TDR_HEADER``         | nested | reply header         |
- +---------------------------------------------+--------+----------------------+
- | ``ETHTOOL_A_CABLE_TEST_TDR_STATUS``         | u8     | completed            |
- +---------------------------------------------+--------+----------------------+
- | ``ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST``       | nested | all the results      |
- +-+-------------------------------------------+--------+----------------------+
- | | ``ETHTOOL_A_CABLE_TDR_NEST_PULSE``        | nested | TX Pulse amplitude   |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_PULSE_mV``            | s16    | Pulse amplitude      |
- +-+-+-----------------------------------------+--------+----------------------+
- | | ``ETHTOOL_A_CABLE_NEST_STEP``             | nested | TDR step info        |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE`` | u32    | First data distance  |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_STEP_LAST_DISTANCE``  | u32    | Last data distance   |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_STEP_STEP_DISTANCE``  | u32    | distance of each step|
- +-+-+-----------------------------------------+--------+----------------------+
- | | ``ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE``    | nested | Reflection amplitude |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_PAIR``        | u8     | pair number          |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_AMPLITUDE_mV``        | s16    | Reflection amplitude |
- +-+-+-----------------------------------------+--------+----------------------+
- | | ``ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE``    | nested | Reflection amplitude |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_PAIR``        | u8     | pair number          |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_AMPLITUDE_mV``        | s16    | Reflection amplitude |
- +-+-+-----------------------------------------+--------+----------------------+
- | | ``ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE``    | nested | Reflection amplitude |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_RESULTS_PAIR``        | u8     | pair number          |
- +-+-+-----------------------------------------+--------+----------------------+
- | | | ``ETHTOOL_A_CABLE_AMPLITUDE_mV``        | s16    | Reflection amplitude |
- +-+-+-----------------------------------------+--------+----------------------+
-
-TUNNEL_INFO
-===========
-
-Gets information about the tunnel state NIC is aware of.
-
-Request contents:
-
-  =====================================  ======  ==========================
-  ``ETHTOOL_A_TUNNEL_INFO_HEADER``       nested  request header
-  =====================================  ======  ==========================
-
-Kernel response contents:
-
- +---------------------------------------------+--------+---------------------+
- | ``ETHTOOL_A_TUNNEL_INFO_HEADER``            | nested | reply header        |
- +---------------------------------------------+--------+---------------------+
- | ``ETHTOOL_A_TUNNEL_INFO_UDP_PORTS``         | nested | all UDP port tables |
- +-+-------------------------------------------+--------+---------------------+
- | | ``ETHTOOL_A_TUNNEL_UDP_TABLE``            | nested | one UDP port table  |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE``     | u32    | max size of the     |
- | | |                                         |        | table               |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES``    | bitset | tunnel types which  |
- | | |                                         |        | table can hold      |
- +-+-+-----------------------------------------+--------+---------------------+
- | | | ``ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY``    | nested | offloaded UDP port  |
- +-+-+-+---------------------------------------+--------+---------------------+
- | | | | ``ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT``   | be16   | UDP port            |
- +-+-+-+---------------------------------------+--------+---------------------+
- | | | | ``ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE``   | u32    | tunnel type         |
- +-+-+-+---------------------------------------+--------+---------------------+
-
-For UDP tunnel table empty ``ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES`` indicates that
-the table contains static entries, hard-coded by the NIC.
-
 Request translation
 ===================
 
 The following table maps ioctl commands to netlink commands providing their
 functionality. Entries with "n/a" in right column are commands which do not
-have their netlink replacement yet. Entries which "n/a" in the left column
-are netlink only.
+have their netlink replacement yet.
 
   =================================== =====================================
   ioctl command                       netlink command
   =================================== =====================================
-  ``ETHTOOL_GSET``                    ``ETHTOOL_MSG_LINKINFO_GET``
-                                      ``ETHTOOL_MSG_LINKMODES_GET``
-  ``ETHTOOL_SSET``                    ``ETHTOOL_MSG_LINKINFO_SET``
-                                      ``ETHTOOL_MSG_LINKMODES_SET``
+  ``ETHTOOL_GSET``                    n/a
+  ``ETHTOOL_SSET``                    n/a
   ``ETHTOOL_GDRVINFO``                n/a
   ``ETHTOOL_GREGS``                   n/a
-  ``ETHTOOL_GWOL``                    ``ETHTOOL_MSG_WOL_GET``
-  ``ETHTOOL_SWOL``                    ``ETHTOOL_MSG_WOL_SET``
-  ``ETHTOOL_GMSGLVL``                 ``ETHTOOL_MSG_DEBUG_GET``
-  ``ETHTOOL_SMSGLVL``                 ``ETHTOOL_MSG_DEBUG_SET``
+  ``ETHTOOL_GWOL``                    n/a
+  ``ETHTOOL_SWOL``                    n/a
+  ``ETHTOOL_GMSGLVL``                 n/a
+  ``ETHTOOL_SMSGLVL``                 n/a
   ``ETHTOOL_NWAY_RST``                n/a
-  ``ETHTOOL_GLINK``                   ``ETHTOOL_MSG_LINKSTATE_GET``
+  ``ETHTOOL_GLINK``                   n/a
   ``ETHTOOL_GEEPROM``                 n/a
   ``ETHTOOL_SEEPROM``                 n/a
-  ``ETHTOOL_GCOALESCE``               ``ETHTOOL_MSG_COALESCE_GET``
-  ``ETHTOOL_SCOALESCE``               ``ETHTOOL_MSG_COALESCE_SET``
-  ``ETHTOOL_GRINGPARAM``              ``ETHTOOL_MSG_RINGS_GET``
-  ``ETHTOOL_SRINGPARAM``              ``ETHTOOL_MSG_RINGS_SET``
-  ``ETHTOOL_GPAUSEPARAM``             ``ETHTOOL_MSG_PAUSE_GET``
-  ``ETHTOOL_SPAUSEPARAM``             ``ETHTOOL_MSG_PAUSE_SET``
-  ``ETHTOOL_GRXCSUM``                 ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SRXCSUM``                 ``ETHTOOL_MSG_FEATURES_SET``
-  ``ETHTOOL_GTXCSUM``                 ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_STXCSUM``                 ``ETHTOOL_MSG_FEATURES_SET``
-  ``ETHTOOL_GSG``                     ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SSG``                     ``ETHTOOL_MSG_FEATURES_SET``
+  ``ETHTOOL_GCOALESCE``               n/a
+  ``ETHTOOL_SCOALESCE``               n/a
+  ``ETHTOOL_GRINGPARAM``              n/a
+  ``ETHTOOL_SRINGPARAM``              n/a
+  ``ETHTOOL_GPAUSEPARAM``             n/a
+  ``ETHTOOL_SPAUSEPARAM``             n/a
+  ``ETHTOOL_GRXCSUM``                 n/a
+  ``ETHTOOL_SRXCSUM``                 n/a
+  ``ETHTOOL_GTXCSUM``                 n/a
+  ``ETHTOOL_STXCSUM``                 n/a
+  ``ETHTOOL_GSG``                     n/a
+  ``ETHTOOL_SSG``                     n/a
   ``ETHTOOL_TEST``                    n/a
-  ``ETHTOOL_GSTRINGS``                ``ETHTOOL_MSG_STRSET_GET``
+  ``ETHTOOL_GSTRINGS``                n/a
   ``ETHTOOL_PHYS_ID``                 n/a
   ``ETHTOOL_GSTATS``                  n/a
-  ``ETHTOOL_GTSO``                    ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_STSO``                    ``ETHTOOL_MSG_FEATURES_SET``
+  ``ETHTOOL_GTSO``                    n/a
+  ``ETHTOOL_STSO``                    n/a
   ``ETHTOOL_GPERMADDR``               rtnetlink ``RTM_GETLINK``
-  ``ETHTOOL_GUFO``                    ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SUFO``                    ``ETHTOOL_MSG_FEATURES_SET``
-  ``ETHTOOL_GGSO``                    ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SGSO``                    ``ETHTOOL_MSG_FEATURES_SET``
-  ``ETHTOOL_GFLAGS``                  ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SFLAGS``                  ``ETHTOOL_MSG_FEATURES_SET``
-  ``ETHTOOL_GPFLAGS``                 ``ETHTOOL_MSG_PRIVFLAGS_GET``
-  ``ETHTOOL_SPFLAGS``                 ``ETHTOOL_MSG_PRIVFLAGS_SET``
+  ``ETHTOOL_GUFO``                    n/a
+  ``ETHTOOL_SUFO``                    n/a
+  ``ETHTOOL_GGSO``                    n/a
+  ``ETHTOOL_SGSO``                    n/a
+  ``ETHTOOL_GFLAGS``                  n/a
+  ``ETHTOOL_SFLAGS``                  n/a
+  ``ETHTOOL_GPFLAGS``                 n/a
+  ``ETHTOOL_SPFLAGS``                 n/a
   ``ETHTOOL_GRXFH``                   n/a
   ``ETHTOOL_SRXFH``                   n/a
-  ``ETHTOOL_GGRO``                    ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SGRO``                    ``ETHTOOL_MSG_FEATURES_SET``
+  ``ETHTOOL_GGRO``                    n/a
+  ``ETHTOOL_SGRO``                    n/a
   ``ETHTOOL_GRXRINGS``                n/a
   ``ETHTOOL_GRXCLSRLCNT``             n/a
   ``ETHTOOL_GRXCLSRULE``              n/a
@@ -1353,36 +269,31 @@ are netlink only.
   ``ETHTOOL_RESET``                   n/a
   ``ETHTOOL_SRXNTUPLE``               n/a
   ``ETHTOOL_GRXNTUPLE``               n/a
-  ``ETHTOOL_GSSET_INFO``              ``ETHTOOL_MSG_STRSET_GET``
+  ``ETHTOOL_GSSET_INFO``              n/a
   ``ETHTOOL_GRXFHINDIR``              n/a
   ``ETHTOOL_SRXFHINDIR``              n/a
-  ``ETHTOOL_GFEATURES``               ``ETHTOOL_MSG_FEATURES_GET``
-  ``ETHTOOL_SFEATURES``               ``ETHTOOL_MSG_FEATURES_SET``
-  ``ETHTOOL_GCHANNELS``               ``ETHTOOL_MSG_CHANNELS_GET``
-  ``ETHTOOL_SCHANNELS``               ``ETHTOOL_MSG_CHANNELS_SET``
+  ``ETHTOOL_GFEATURES``               n/a
+  ``ETHTOOL_SFEATURES``               n/a
+  ``ETHTOOL_GCHANNELS``               n/a
+  ``ETHTOOL_SCHANNELS``               n/a
   ``ETHTOOL_SET_DUMP``                n/a
   ``ETHTOOL_GET_DUMP_FLAG``           n/a
   ``ETHTOOL_GET_DUMP_DATA``           n/a
-  ``ETHTOOL_GET_TS_INFO``             ``ETHTOOL_MSG_TSINFO_GET``
+  ``ETHTOOL_GET_TS_INFO``             n/a
   ``ETHTOOL_GMODULEINFO``             n/a
   ``ETHTOOL_GMODULEEEPROM``           n/a
-  ``ETHTOOL_GEEE``                    ``ETHTOOL_MSG_EEE_GET``
-  ``ETHTOOL_SEEE``                    ``ETHTOOL_MSG_EEE_SET``
+  ``ETHTOOL_GEEE``                    n/a
+  ``ETHTOOL_SEEE``                    n/a
   ``ETHTOOL_GRSSH``                   n/a
   ``ETHTOOL_SRSSH``                   n/a
   ``ETHTOOL_GTUNABLE``                n/a
   ``ETHTOOL_STUNABLE``                n/a
   ``ETHTOOL_GPHYSTATS``               n/a
   ``ETHTOOL_PERQUEUE``                n/a
-  ``ETHTOOL_GLINKSETTINGS``           ``ETHTOOL_MSG_LINKINFO_GET``
-                                      ``ETHTOOL_MSG_LINKMODES_GET``
-  ``ETHTOOL_SLINKSETTINGS``           ``ETHTOOL_MSG_LINKINFO_SET``
-                                      ``ETHTOOL_MSG_LINKMODES_SET``
+  ``ETHTOOL_GLINKSETTINGS``           n/a
+  ``ETHTOOL_SLINKSETTINGS``           n/a
   ``ETHTOOL_PHY_GTUNABLE``            n/a
   ``ETHTOOL_PHY_STUNABLE``            n/a
   ``ETHTOOL_GFECPARAM``               n/a
   ``ETHTOOL_SFECPARAM``               n/a
-  n/a                                 ''ETHTOOL_MSG_CABLE_TEST_ACT''
-  n/a                                 ''ETHTOOL_MSG_CABLE_TEST_TDR_ACT''
-  n/a                                 ``ETHTOOL_MSG_TUNNEL_INFO_GET``
   =================================== =====================================
diff --git a/Documentation/networking/index.rst b/Documentation/networking/index.rst
index 3786f3b7274c..510d4c45270d 100644
--- a/Documentation/networking/index.rst
+++ b/Documentation/networking/index.rst
@@ -11,9 +11,13 @@ Contents:
    batman-adv
    can
    can_ucan_protocol
-   dpaa2/index
-   e100
-   e1000
+   device_drivers/index
+   dsa/index
+   devlink-info-versions
+   devlink-trap
+   devlink-trap-netdevsim
+   ethtool-netlink
+   ieee802154
    j1939
    kapi
    z8530book
diff --git a/include/linux/ethtool_netlink.h b/include/linux/ethtool_netlink.h
new file mode 100644
index 000000000000..f27e92b5f344
--- /dev/null
+++ b/include/linux/ethtool_netlink.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _LINUX_ETHTOOL_NETLINK_H_
+#define _LINUX_ETHTOOL_NETLINK_H_
+
+#include <uapi/linux/ethtool_netlink.h>
+#include <linux/ethtool.h>
+
+#endif /* _LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
new file mode 100644
index 000000000000..3c93276ba066
--- /dev/null
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
+/*
+ * include/uapi/linux/ethtool_netlink.h - netlink interface for ethtool
+ *
+ * See Documentation/networking/ethtool-netlink.txt in kernel source tree for
+ * doucumentation of the interface.
+ */
+
+#ifndef _UAPI_LINUX_ETHTOOL_NETLINK_H_
+#define _UAPI_LINUX_ETHTOOL_NETLINK_H_
+
+#include <linux/ethtool.h>
+
+/* message types - userspace to kernel */
+enum {
+	ETHTOOL_MSG_USER_NONE,
+
+	/* add new constants above here */
+	__ETHTOOL_MSG_USER_CNT,
+	ETHTOOL_MSG_USER_MAX = __ETHTOOL_MSG_USER_CNT - 1
+};
+
+/* message types - kernel to userspace */
+enum {
+	ETHTOOL_MSG_KERNEL_NONE,
+
+	/* add new constants above here */
+	__ETHTOOL_MSG_KERNEL_CNT,
+	ETHTOOL_MSG_KERNEL_MAX = __ETHTOOL_MSG_KERNEL_CNT - 1
+};
+
+/* generic netlink info */
+#define ETHTOOL_GENL_NAME "ethtool"
+#define ETHTOOL_GENL_VERSION 1
+
+#endif /* _UAPI_LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/net/Kconfig b/net/Kconfig
index 4bef62b4c806..a279f66876c9 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -443,6 +443,14 @@ config FAILOVER
 	  migration of VMs with direct attached VFs by failing over to the
 	  paravirtual datapath when the VF is unplugged.
 
+config ETHTOOL_NETLINK
+	bool "Netlink interface for ethtool"
+	default y
+	help
+	  An alternative userspace interface for ethtool based on generic
+	  netlink. It provides better extensibility and some new features,
+	  e.g. notification messages.
+
 endif   # if NET
 
 # Used by archs to tell that they support BPF JIT compiler plus which flavour.
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
index f68387618973..59d5ee230c29 100644
--- a/net/ethtool/Makefile
+++ b/net/ethtool/Makefile
@@ -1,3 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
-obj-y		+= ioctl.o common.o
+obj-y				+= ioctl.o common.o
+
+obj-$(CONFIG_ETHTOOL_NETLINK)	+= ethtool_nl.o
+
+ethtool_nl-y	:= netlink.o
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
new file mode 100644
index 000000000000..59e1ebde2f15
--- /dev/null
+++ b/net/ethtool/netlink.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/ethtool_netlink.h>
+#include "netlink.h"
+
+/* genetlink setup */
+
+static const struct genl_ops ethtool_genl_ops[] = {
+};
+
+static struct genl_family ethtool_genl_family = {
+	.name		= ETHTOOL_GENL_NAME,
+	.version	= ETHTOOL_GENL_VERSION,
+	.netnsok	= true,
+	.parallel_ops	= true,
+	.ops		= ethtool_genl_ops,
+	.n_ops		= ARRAY_SIZE(ethtool_genl_ops),
+};
+
+/* module setup */
+
+static int __init ethnl_init(void)
+{
+	int ret;
+
+	ret = genl_register_family(&ethtool_genl_family);
+	if (WARN(ret < 0, "ethtool: genetlink family registration failed"))
+		return ret;
+
+	return 0;
+}
+
+subsys_initcall(ethnl_init);
diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
new file mode 100644
index 000000000000..e4220780d368
--- /dev/null
+++ b/net/ethtool/netlink.h
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _NET_ETHTOOL_NETLINK_H
+#define _NET_ETHTOOL_NETLINK_H
+
+#include <linux/ethtool_netlink.h>
+#include <linux/netdevice.h>
+#include <net/genetlink.h>
+
+#endif /* _NET_ETHTOOL_NETLINK_H */
-- 
2.34.1

