[RFC net-next 0/4] ethtool: CMIS module diagnostic loopback support

From: Björn Töpel

Date: Thu Feb 19 2026 - 08:01:10 EST


Hi!

Background
==========

This series adds initial ethtool support for CMIS loopback.

The Common Management Interface Specification (CMIS) is an
industry-standard used by host devices (like switches and routers) to
talk to high-speed optical transceivers (like QSFP-DD, OSFP, and
QSFP112).

Ethtool already supports mechanism updating the transceiver firmware
via CMIS, and this series builds on top of this work.

In CMIS, four different types of loopback are defined by the
specification, characterized by the location of the loopback on Host
(electrical) or Media (optical) Side and the direction of the signal
being looped-back:

* Media Side Output (Tx->Rx) Loopback
* Media Side Input (Rx->Tx) Loopback
* Host Side Output (Tx->Rx) Loopback
* Host Side Input (Rx->Tx) Loopback

To detect and enable loopback in a CMIS transceiver, the following
registers are used:

* Detect Support: Read Page 13h, Byte 128 indicate if the hardware
supports host-side or media-side loopback.

* Enable Loopback: Write to Page 13h, Bytes 180–184. Each bit in these
registers typically corresponds to a specific lane (0–7). Setting a
bit to 1 requests loopback for that lane.


Implementation
==============

Patch 1/4 ethtool: module: Define CMIS loopback YAML spec and UAPI
Adds the netlink YAML specification and UAPI for module loopback.
Defines a flags enum with the four CMIS 5.2 diagnostic loopback
types (media-side output/input, host-side output/input) and two new
module attributes: loopback-capabilities (supported modes) and
loopback-enabled (active modes). Regenerates the UAPI header.

Patch 2/4 ethtool: module: Add CMIS loopback GET/SET support
Implements the core loopback GET/SET logic for CMIS modules. Reads
capabilities from Page 01h Byte 142 and controls loopback via Page
13h Bytes 180-183, using the existing get/set_module_eeprom_by_page
driver ops. No new ethtool_ops callbacks are introduced.

Patch 3/4 ethtool: module: refactor fw flash init to reuse CMIS
helpers Refactors module_flash_fw_work_init() to reuse the
module_is_cmis() helper and ethtool_cmis_page_init() introduced in
patch 2, removing open-coded CMIS type checking and manual EEPROM
page setup from the firmware flash path.

Patch 4/4 net/mlx5e: Implement set_module_eeprom_by_page ethtool
callback Adds EEPROM write support to mlx5 by implementing
set_module_eeprom_by_page, mirroring the existing read path via the
MCIA register. This enables the loopback SET path which requires
both get and set callbacks.


Limitations
===========

Only four modes are supported host/media-side near-/far-end. No
per-lane support.

I'm working on kselftest; It's not part of the RFC.


RFC
===

I'm not familiar with the mlx5 internals, and need guidance if my
set_module_eeprom_by_page() hack is the right way forward. I've tested
this on a transceiver in a CX7 NIC, and it did switch on the loopback
mode, so it's somewhat working.

I'd like input from other NIC vendors, if the
{set,get}_module_eeprom_by_page() is the right interface/ops from a
driver POV.

Extensibility; Is this the right interface?


Related work
============

* New loopback modes [1].
* PHY loopback [2]
* bnxt_en: add .set_module_eeprom_by_page() support [3]
* ethtool: qsfp transceiver reset, interrupt and presence pin control
[4]

[1] https://lore.kernel.org/netdev/20251024044849.1098222-1-hkelam@xxxxxxxxxxx/
[2] https://lore.kernel.org/netdev/20240911212713.2178943-1-maxime.chevallier@xxxxxxxxxxx/
[3] https://lore.kernel.org/netdev/20250310183129.3154117-8-michael.chan@xxxxxxxxxxxx/
[4] https://lore.kernel.org/netdev/20250513224017.202236-1-mpazdan@xxxxxxxxxx/


Björn Töpel (4):
ethtool: module: Define CMIS loopback YAML spec and UAPI
ethtool: module: Add CMIS loopback GET/SET support
ethtool: module: refactor fw flash init to reuse CMIS helpers
net/mlx5e: Implement set_module_eeprom_by_page ethtool callback

Documentation/netlink/specs/ethtool.yaml | 27 ++
.../ethernet/mellanox/mlx5/core/en_ethtool.c | 52 ++-
.../ethernet/mellanox/mlx5/core/mlx5_core.h | 6 +-
.../net/ethernet/mellanox/mlx5/core/port.c | 34 +-
include/linux/ethtool.h | 12 +
.../uapi/linux/ethtool_netlink_generated.h | 22 ++
net/ethtool/module.c | 302 ++++++++++++++++--
net/ethtool/netlink.h | 2 +-
8 files changed, 397 insertions(+), 60 deletions(-)


base-commit: 37a93dd5c49b5fda807fd204edf2547c3493319c
--
2.53.0