From: "Björn Töpel" <bjorn@kernel.org>
To: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Donald Hunter <donald.hunter@gmail.com>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Maxime Chevallier <maxime.chevallier@bootlin.com>,
Naveen Mamindlapalli <naveenm@marvell.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>
Cc: "Björn Töpel" <bjorn@kernel.org>,
"Danielle Ratson" <danieller@nvidia.com>,
"Hariprasad Kelam" <hkelam@marvell.com>,
"Ido Schimmel" <idosch@nvidia.com>,
"Kory Maincent" <kory.maincent@bootlin.com>,
"Leon Romanovsky" <leon@kernel.org>,
"Michael Chan" <michael.chan@broadcom.com>,
"Oleksij Rempel" <o.rempel@pengutronix.de>,
"Pavan Chebbi" <pavan.chebbi@broadcom.com>,
"Piergiorgio Beruto" <piergiorgio.beruto@gmail.com>,
"Russell King" <linux@armlinux.org.uk>,
"Saeed Mahameed" <saeedm@nvidia.com>,
"Shuah Khan" <shuah@kernel.org>,
"Tariq Toukan" <tariqt@nvidia.com>,
"Willem de Bruijn" <willemb@google.com>,
"Kees Cook" <kees@kernel.org>,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-rdma@vger.kernel.org
Subject: [PATCH net-next v2 00/12] ethtool: Generic loopback support
Date: Wed, 25 Mar 2026 15:50:07 +0100 [thread overview]
Message-ID: <20260325145022.2607545-1-bjorn@kernel.org> (raw)
Hi!
Background
==========
This series adds a generic ethtool loopback framework with GET/SET
netlink commands, using a component/name/id/depth model that
represents loopback points across the network path.
This is v2.
Design
======
The loopback model uses four axes to identify a loopback point:
1. Component (MAC, PHY, MODULE) -- identifies the Linux driver
boundary that owns the loopback. This maps to the Linux driver
model, not to 802.3 sublayers directly.
2. Name -- identifies the sublayer within the component using IEEE
802.3 vocabulary (e.g. "mac", "pcs", "pma", "pmd", "mii" for MAC
and PHY components; "cmis-host", "cmis-media" for MODULE). The
name is a free-form string to avoid over-constraining the enum,
but recommended names are documented with references to 802.3
clauses.
3. Id -- optional instance selector within a component type (e.g.
PHY index from phy_link_topology, port number). Defaults to 0
when there is only one instance.
4. Depth -- ordering index within a component instance. When a
component has multiple loopback points of the same type (e.g. two
PCS blocks inside a rate-adaptation PHY), depth distinguishes
them. Lower values are closer to the host, higher toward the
line/media. Defaults to 0 when there is only one loopback point
per (component, name) tuple.
Direction uses IEEE 802.3 terminology: "local" (host TX -> looped back
-> host RX, traffic originating from host returns to host) and
"remote" (line RX -> looped back -> line TX, traffic from far end
returns to far end). Direction is defined from the component's own
viewpoint -- this convention holds regardless of where the component
sits in the system topology.
Cross-component ordering comes from existing infrastructure (PHY link
topology, phy_index). Multi-netdev shared-resource loopbacks (QSGMII,
port breakout) are out of scope; drivers should only expose loopbacks
they can scope to a single netdev.
A filtered DUMP (with a dev-index in the header) lists all loopback
entries for that netdev; an unfiltered DUMP iterates over all netdevs.
The doit handler supports exact lookup by (component, name, id).
V2 design rationale
===================
Why keep name as a string for now? The review discussed replacing name
with an enum. I decided not to do that in v2.
Pros:
- enforces more consistency across drivers
- makes userspace parsing simpler
- makes selftests stricter
- keeps the UAPI taxonomy explicit
Cons:
- freezes the stage taxonomy before we fully understand the MAC side
- risks forcing unlike hardware points into the same enum bucket
- makes later extension more expensive
- may standardize the spelling without standardizing the actual
semantics
This series still does not attempt to model the full datapath as a DAG
or expose a generic topology dump. That would likely be useful for
future diagnostics, traffic generators, and deeper validation, but it
also looks like a larger design problem than loopback itself.
The intent of v2 is not to solve that larger problem now, but also not
to block it:
- component gives the Linux ownership boundary
- name keeps room for stage-specific vocabulary
- id selects the component instance
- depth orders loopback points within that instance
If a richer topology API is needed later, it should be additive rather
than requiring this loopback API to be replaced.
Oleksij's more topology-heavy use cases are therefore not fully solved
by this series, but the current model should still be extendable for
them.
CMIS support
============
The Common Management Interface Specification (CMIS) defines four
diagnostic loopback types, characterized by location (Host or Media
Side) and signal direction:
- Host Side Input (Rx->Tx) -- local
- Host Side Output (Tx->Rx) -- remote
- Media Side Input (Rx->Tx) -- local
- Media Side Output (Tx->Rx) -- remote
Support is detected via Page 13h Byte 128, and loopback is controlled
via Page 13h Bytes 180-183 (one byte per type, one bit per lane).
The CMIS helpers work entirely over get/set_module_eeprom_by_page, so
any driver that already has EEPROM page access gets module loopback
without new ethtool_ops or driver changes.
Currently, only mellanox/mlxsw, and broadcom/bnxt support CMIS
operations. I'll follow-up with mlx5 support.
Implementation
==============
Patch 1/12 ethtool: Add dump_one_dev callback for per-device sub-iteration
Adds the dump_one_dev callback to ethnl_request_ops, the ifindex and
pos_sub fields to ethnl_dump_ctx, and the dispatch logic in
ethnl_default_start() and ethnl_default_dumpit(). No functional
change; no command uses dump_one_dev yet.
Patch 2/12 ethtool: Convert per-PHY commands to dump_one_dev
Converts PSE, PLCA, PHY, and MSE commands from the separate
ethnl_perphy_{start,dumpit,done} handlers to use the generic
dump_one_dev callback via a shared ethnl_perphy_dump_one_dev()
function.
Patch 3/12 ethtool: Add loopback netlink UAPI definitions
Adds the YAML spec and generated UAPI header for the new
LOOPBACK_GET/SET commands. Each loopback entry carries a component
type, optional id, name string, depth, supported directions
bitmask, and current direction.
Patch 4/12 ethtool: Add loopback GET/SET netlink implementation
Implements GET/SET dispatch in a new loopback.c. GET uses the
dump_one_dev infrastructure for dump enumeration (by flat index)
and supports doit exact lookup by (component, id, name) via
parse_request. SET switches on the component and calls the right
handler per entry. No components are wired yet.
Patch 5/12 ethtool: Add CMIS loopback helpers for module loopback control
Adds cmis_loopback.c with the MODULE component handlers and wires
them into loopback.c's dispatch. GET enumerates entries by index
(ethtool_cmis_get_loopback_by_index) or looks up by name
(ethtool_cmis_get_loopback). SET (ethtool_cmis_set_loopback)
resolves name to control byte indices and enforces mutual
exclusivity.
Patch 6/12 selftests: drv-net: Add loopback driver test
Adds loopback_drv.py with generic tests that work on any device
with module loopback support: enable/disable, direction switching,
idempotent enable, and rejection while interface is up.
Patch 7/12 ethtool: Add MAC loopback support via ethtool_ops
Extends struct ethtool_ops with three loopback callbacks for
driver-level MAC loopback: get_loopback (exact lookup by name/id),
get_loopback_by_index (dump enumeration), and set_loopback. Wires
the MAC component into loopback.c's dispatch. For dump enumeration,
MAC entries are tried first, then MODULE/CMIS entries follow at the
next index offset.
Patch 8/12 netdevsim: Add MAC loopback simulation
Implements the three ethtool loopback ops in netdevsim. Exposes a
single MAC loopback entry ("mac") with both local and remote
support. State is stored in memory and exposed via debugfs under
ethtool/mac_lb/{supported,direction}.
Patch 9/12 selftests: drv-net: Add MAC loopback netdevsim test
Adds loopback_nsim.py with netdevsim-specific tests for MAC
loopback: entry presence, SET/GET round-trip with debugfs
verification, and error paths.
Patch 10/12 MAINTAINERS: Add entry for ethtool loopback
Adds a MAINTAINERS entry for the ethtool loopback subsystem covering
the core loopback and CMIS loopback netlink implementation, and the
associated selftests.
Patch 11/12 netdevsim: Add module EEPROM simulation via debugfs
Adds get/set_module_eeprom_by_page to netdevsim, backed by a
256-page x 128-byte array exposed via debugfs.
Patch 12/12 selftests: drv-net: Add CMIS loopback netdevsim test
Extends loopback_nsim.py with netdevsim-specific tests that seed the
EEPROM via debugfs: capability reporting, EEPROM byte verification,
combined MAC + MODULE dump, and error paths.
Changes since v1
================
- Split dump_one_dev infrastructure patch into two: one adding the
generic callback infrastructure, one converting per-PHY commands
to use it. (Jakub)
- Used Jakub's suggested pattern for filtered dumps: initialize both
ifindex and pos_ifindex in _start(), then break early in the loop
when pos_ifindex diverges, avoiding a separate single-device code
path. (Jakub)
- Dropped PCS as a top-level component. Components now map to Linux
driver boundaries: MAC, PHY, MODULE. Sublayer granularity (pcs,
pma, pmd, mii) lives in the name attribute using IEEE 802.3
vocabulary. (Maxime)
- Renamed near-end/far-end to local/remote per IEEE 802.3
terminology. (Maxime)
- Added depth field to ETHTOOL_A_LOOPBACK_ENTRY for ordering
multiple loopback points within a single component instance (e.g.
rate-adaptation PHY with two PCS blocks). (Jakub)
- Documented the viewpoint convention: direction is always from the
component's own perspective, local = toward host, remote = toward
line, regardless of system topology. (Oleksij)
- Expanded component doc strings to explain that the name attribute
uses IEEE 802.3 sublayer vocabulary. (Andrew, Maxime)
Changes since RFC v2
====================
- Switched LOOPBACK_GET from doit-with-array to dumpit, where each
loopback entry is a separate netlink message. Uses the new generic
dump_one_dev sub-iterator infrastructure instead of duplicating the
perphy dump pattern. (Maxime)
- u32 to u8 to represent the enums in the YAML. (Maxime)
- Tried to document the YAML better. (Andrew)
- Added doit exact lookup by (component, id, name) via
parse_request, so single-entry GET doesn't need a flat index.
- Added MAC loopback support via three new ethtool_ops callbacks
(get_loopback(), get_loopback_by_index(), set_loopback()) with
netdevsim implementation and tests.
- Added MAINTAINERS entry.
Opens/limitations
=================
- mlx5 CMIS support is still not part of the series.
- PHY loopback is defined in the UAPI but not yet implemented.
- No per-lane support -- loopback is all-or-nothing (0xff/0x00)
across lanes.
Related work
============
[1] Generic loopback support, v1
https://lore.kernel.org/netdev/20260310104743.907818-1-bjorn@kernel.org/
[2] Generic loopback support, RFC v2
https://lore.kernel.org/netdev/20260219130050.2390226-1-bjorn@kernel.org/
[3] New loopback modes
https://lore.kernel.org/netdev/20251024044849.1098222-1-hkelam@marvell.com/
[4] PHY loopback
https://lore.kernel.org/netdev/20240911212713.2178943-1-maxime.chevallier@bootlin.com/
[5] bnxt_en: add .set_module_eeprom_by_page() support
https://lore.kernel.org/netdev/20250310183129.3154117-8-michael.chan@broadcom.com/
[6] net/mlx5e: Implement set_module_eeprom_by_page ethtool callback
https://lore.kernel.org/netdev/20260219130050.2390226-5-bjorn@kernel.org/
Björn Töpel (12):
ethtool: Add dump_one_dev callback for per-device sub-iteration
ethtool: Convert per-PHY commands to dump_one_dev
ethtool: Add loopback netlink UAPI definitions
ethtool: Add loopback GET/SET netlink implementation
ethtool: Add CMIS loopback helpers for module loopback control
selftests: drv-net: Add loopback driver test
ethtool: Add MAC loopback support via ethtool_ops
netdevsim: Add MAC loopback simulation
selftests: drv-net: Add MAC loopback netdevsim test
MAINTAINERS: Add entry for ethtool loopback
netdevsim: Add module EEPROM simulation via debugfs
selftests: drv-net: Add CMIS loopback netdevsim test
Documentation/netlink/specs/ethtool.yaml | 142 ++++++
MAINTAINERS | 6 +
drivers/net/netdevsim/ethtool.c | 147 +++++++
drivers/net/netdevsim/netdevsim.h | 15 +
include/linux/ethtool.h | 28 ++
.../uapi/linux/ethtool_netlink_generated.h | 67 +++
net/ethtool/Makefile | 2 +-
net/ethtool/cmis_loopback.c | 407 ++++++++++++++++++
net/ethtool/loopback.c | 351 +++++++++++++++
net/ethtool/mse.c | 1 +
net/ethtool/netlink.c | 284 ++++--------
net/ethtool/netlink.h | 49 +++
net/ethtool/phy.c | 1 +
net/ethtool/plca.c | 2 +
net/ethtool/pse-pd.c | 1 +
.../testing/selftests/drivers/net/hw/Makefile | 2 +
.../selftests/drivers/net/hw/loopback_drv.py | 227 ++++++++++
.../selftests/drivers/net/hw/loopback_nsim.py | 343 +++++++++++++++
18 files changed, 1865 insertions(+), 210 deletions(-)
create mode 100644 net/ethtool/cmis_loopback.c
create mode 100644 net/ethtool/loopback.c
create mode 100755 tools/testing/selftests/drivers/net/hw/loopback_drv.py
create mode 100755 tools/testing/selftests/drivers/net/hw/loopback_nsim.py
base-commit: d1e59a46973719e458bec78d00dd767d7a7ba71f
--
2.53.0
next reply other threads:[~2026-03-25 14:50 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-25 14:50 Björn Töpel [this message]
2026-03-25 14:50 ` [PATCH net-next v2 01/12] ethtool: Add dump_one_dev callback for per-device sub-iteration Björn Töpel
2026-03-25 18:20 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 02/12] ethtool: Convert per-PHY commands to dump_one_dev Björn Töpel
2026-03-25 18:21 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 03/12] ethtool: Add loopback netlink UAPI definitions Björn Töpel
2026-03-26 8:10 ` Maxime Chevallier
2026-03-26 8:55 ` Björn Töpel
2026-03-26 22:22 ` Jakub Kicinski
2026-03-26 22:23 ` Jakub Kicinski
2026-03-27 8:57 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 04/12] ethtool: Add loopback GET/SET netlink implementation Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 05/12] ethtool: Add CMIS loopback helpers for module loopback control Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 06/12] selftests: drv-net: Add loopback driver test Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 07/12] ethtool: Add MAC loopback support via ethtool_ops Björn Töpel
2026-03-26 9:49 ` Breno Leitao
2026-03-25 14:50 ` [PATCH net-next v2 08/12] netdevsim: Add MAC loopback simulation Björn Töpel
2026-03-26 9:40 ` Breno Leitao
2026-03-25 14:50 ` [PATCH net-next v2 09/12] selftests: drv-net: Add MAC loopback netdevsim test Björn Töpel
2026-03-26 9:32 ` Breno Leitao
2026-03-26 9:44 ` Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 10/12] MAINTAINERS: Add entry for ethtool loopback Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 11/12] netdevsim: Add module EEPROM simulation via debugfs Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 12/12] selftests: drv-net: Add CMIS loopback netdevsim test Björn Töpel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260325145022.2607545-1-bjorn@kernel.org \
--to=bjorn@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=danieller@nvidia.com \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=edumazet@google.com \
--cc=hkelam@marvell.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=kees@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maxime.chevallier@bootlin.com \
--cc=michael.chan@broadcom.com \
--cc=naveenm@marvell.com \
--cc=netdev@vger.kernel.org \
--cc=o.rempel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=piergiorgio.beruto@gmail.com \
--cc=saeedm@nvidia.com \
--cc=shuah@kernel.org \
--cc=tariqt@nvidia.com \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.