Re: [PATCH net-next v18 00/10] net: phy_port: SFP modules representation and phy_port listing

From: Christophe Leroy (CS GROUP)

Date: Mon Sep 28 2026 - 13:38:43 EST




Le 27/09/2026 à 15:36, Maxime Chevallier a écrit :
Hello everyone,

Here's V18 for the phy_port improved SFP support and netlink interface.

V18 aggregates Andrew's reviews (thanks !) and Aleksei Tested-by tags
(thank you as well, this is nice). It also contains a few tweaks
following sashiko and Aleksei's report after testing, the ops-locked
check also checks for NULL netdev ops. I also added a missing rtnl()
around port deletion in phylink, and changed a bitfield to a bool in
phy.h following sashiko and Aleksei's reviews.

This work extends on the recent addition of phy_port representation to enable
listing the front-facing ports of an interface. For now, we don't control
these ports, we merely list their presence and their capabilities.

As the most common use-case of multi-port interfaces is combo-ports that
provide both RJ45 and SFP connectors on a single MAC, there's a lot of
SFP stuff in this series.

This series is in 2 main parts. The first one aims at representing the
SFP cages and modules using phy_port, as combo-ports with RJ45 + SFP are
by far the most common cases for multi-connector setups.

The second part is the netlink interface to list those ports, now that
most use-cases are covered.

Let's see what we can do with some examples of the new ethtool API :

- Get MII interfaces supported by an empty SFP cage :

# ethtool --show-ports eth3

Port for eth3:
Port id: 1
Supported MII interfaces : sgmii, 1000base-x, 2500base-x
Port type: sfp

- Get Combo-ports supported modes, on each port :

# ethtool --show-ports eth1

Port for eth1:
Port id: 1
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
10000baseT/Full
2500baseT/Full
5000baseT/Full

Port type: mdi

Port for eth1:
Port id: 2
Supported MII interfaces : 10gbase-r
Port type: sfp

- Get Achievable linkmodes on a SFP module (combo port with a DAC in the
SFP cage)

# ethtool --show-ports eth1

Port for eth1:
Port id: 1
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
10000baseT/Full
2500baseT/Full
5000baseT/Full
Port type: mdi

Port for eth1:
Port id: 2
Supported MII interfaces : 10gbase-r
Port type: sfp

Port for eth1:
Port id: 3
Upstream id: 2
Supported link modes: 10000baseCR/Full
Port type: mdi

Note that here, we have 3 ports :
- The Copper port
- The SFP Cage itself,
- The SFP module

This series builds on top of phy_port and phy_link_topology to allow
tracking the ports of an interface. We maintain a list of supported
linkmodes/interfaces on each port, which allows for fine-grained
reporting of each port's capability.

What this series doesn't do :
- We don't support selecting which port is active. This is the next step.
- We only support PHY-driven combo ports. The end-goal of this whole
journey that started with phy_link_topology is to get support for MII
muxes, such as the one we have on the Turris Omnia. This will eventually
be upstreamed as well.

If you want to play around with it, here's [1] the patched ethtool that I've
been using to produce the outputs above.

Thanks !


Tested on one of my powerpc boards, I get the expected result:

~# ./ethtool --show-ports eth0

Port for eth0:
Port id: 1
Port type: phy
forced : off

Tested-by: Christophe Leroy (CS GROUP) <chleroy@xxxxxxxxxx>

Looking forward to the support for MII muxes.