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

Maxime Chevallier posted 10 patches 2 weeks, 2 days ago
Only 7 patches received!
There is a newer version of this series
Documentation/netlink/specs/ethtool.yaml      |  55 +++
Documentation/networking/ethtool-netlink.rst  |  34 ++
Documentation/networking/phy-port.rst         |  26 +-
MAINTAINERS                                   |   1 +
drivers/net/phy/phy-caps.h                    |   2 +
drivers/net/phy/phy_caps.c                    |  26 ++
drivers/net/phy/phy_device.c                  | 186 +++++++--
drivers/net/phy/phy_link_topology.c           | 101 ++++-
drivers/net/phy/phylink.c                     | 128 +++++-
include/linux/phy.h                           |  10 +
include/linux/phy_link_topology.h             |  44 ++
include/linux/phy_port.h                      |   5 +
.../uapi/linux/ethtool_netlink_generated.h    |  22 +
net/core/dev.c                                |   1 +
net/ethtool/Makefile                          |   2 +-
net/ethtool/netlink.c                         |  25 ++
net/ethtool/netlink.h                         |   8 +
net/ethtool/port.c                            | 382 ++++++++++++++++++
18 files changed, 1020 insertions(+), 38 deletions(-)
create mode 100644 net/ethtool/port.c
[PATCH net-next v17 00/10] net: phy_port: SFP modules representation and phy_port listing
Posted by Maxime Chevallier 2 weeks, 2 days ago
Hello everyone,

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

V17 addresses the port_id wrapparound with the xarray insertion, and the
missing comment during the ethtool header regen from the YNL specs.

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, marked as 'occupied'
 - 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 !

Maxime

[1] : https://github.com/minimaxwell/ethtool/tree/mc/ethtool_port

Changelog :

Changes in v17:
 - Handle port index wraparound
 - Regen the ethtool headers, now with the comment :)

Changes in v16:
https://lore.kernel.org/r/20260902212135.1805948-1-maxime.chevallier@bootlin.com
 - unregister phy_ports at phy_detach
 - typos in patch 1 (of -> or)
 - Fix the netlink specs

Changes in v15:
https://lore.kernel.org/netdev/20260801074332.98755-1-maxime.chevallier@bootlin.com/
 - Fail on port access for ops-locked devices
 - Use a direct phy_port pointer for upstream tracking
 - Addressed the kdoc issues

Changes in v14:
https://lore.kernel.org/netdev/20260720174808.139573-1-maxime.chevallier@bootlin.com/
 - Added a big comment on the first patch for the topo alloc potential
   races
 - Fixed the multi-buff DUMP on last patch with a separate iterator for
   dumps
 - Fixed some typos in the documentation

Changes in V13:
V13: https://lore.kernel.org/r/20260701110427.143945-1-maxime.chevallier@bootlin.com
 - Rebase on net-next
 - Fix the SFP bus cleanup path in patch 5

Changes in V12:
V12: https://lore.kernel.org/r/20260615153907.862987-1-maxime.chevallier@bootlin.com
 - Rebased on net-next, including fixes on the phy probing and cleanup
   paths
 - Rebased on Jakub's netdev_ops_locked changes in phy_link_topology
 - Fixed some typos reported by Andrew and sashiko in the documentation

Changes in v11:
V11:https://lore.kernel.org/r/20260521121040.1199622-1-maxime.chevallier@bootlin.com
 - Aggregated Andrew's reviews :)
 - Removed the "vacant" field, replaced it with "upstream_port"

Changes in V10:
V10: https://lore.kernel.org/r/20260513130521.1064094-1-maxime.chevallier@bootlin.com
 - Rebase on net-next
 - Rename phylink/phy_device sfp_bus_port to sfp_cage_port
 - Sashiko's reviews were mostly unrealistic or wrong :(

Changes in V9:
V9: https://lore.kernel.org/r/20260403123755.175742-1-maxime.chevallier@bootlin.com
 - Added missing netlink doc updates for u8->u32 conversion
 - Removed dead code with a condition that can never be true in
   phylink's mod_port code
 - Fixed the error path in phy_sfp_connect_phy

Changes in v8:
V8: https://lore.kernel.org/r/20260325081937.571115-1-maxime.chevallier@bootlin.com
 - Set the new phydev.has_sfp_mod_phy field when we're sure that no
   errors occured
 - Fix formatting of the copyright info in ethnl port
 - Use a policy to validate the range of port_id
 - Use GENL_REQ_ATTR_CHECK
 - alpha-sort headers
 - use u32 in netlink messages
 - return better error codes
 - don't check the skb len, the core does that

Changes in V7:
V7: https://lore.kernel.org/all/20260309152747.702373-1-maxime.chevallier@bootlin.com/
 - Changed the port cleanup path to use list_for_each_entry_continue_reverse
 - Adjusted the cleanup path in phylink for the port vacant state
 - Pass the right cmd for the netlink dump message

Changes in V6:
V6: https://lore.kernel.org/r/20260304145444.442334-1-maxime.chevallier@bootlin.com
 - Added some comments in th mod_port cleanup
 - changed some kmalloc to kmalloc_obj
 - Removed some phy_link_topo_del_port that wasn't needed

Changes in V5:
V5: https://lore.kernel.org/r/20260205092317.755906-1-maxime.chevallier@bootlin.com
 - Fixed a check on a potentially un-initialized pointer, reported by
   Simon
 - Fixed a documentation formatting issue
 - Remove a stray pr_info
 - Rebased on net-next

Changes in V4:
V4 : https://lore.kernel.org/netdev/20260203172839.548524-1-maxime.chevallier@bootlin.com/
 - Add a cleanup patch for the of port parsing
 - Added a match to sync the port's linkmodes with the PHY's for OF
   ports
 - Added RTNL assert in the port_get topo helper
 - nullify the bus port for phylink support
 - Fix some typos

Changes in V3:
V3: https://lore.kernel.org/netdev/20260201151249.642015-1-maxime.chevallier@bootlin.com/
 - Remove the sfp bus ops for nophy, and use .module_start() as
   suggested by Russell
 - Added missing cleanup for the topology, as per AI review
 - Fixed a few typos as per Romain's review
 - Changed "occupied" to "vacant" as per Romain's review
 - Added missing checks for null ports, per AI review

Changes in V2:
V2: https://lore.kernel.org/netdev/20260128204526.170927-1-maxime.chevallier@bootlin.com/
 - Fix the cleanup path of phy_link_topo_add_phy, as per AI review
 - Fix the cleanup path of phy_sfp_probe, as per AI review
 - Fix the call-site of the disconnect_nophy sfp bus ops, per AI review
 - Fix the netdev-less case uin phylink, per AI review
 - Fix the prototype of phy_link_topo_get_port for the stubs
 - Dropped patch 11. It ended-up breaking 'allnoconfig', so instead we
   built a phy_interface_names array in net/ethtool/netlink.c
 - Fix an ethool-netlink spec discrepancy with the type of an attribute
 - Fix the size computation in the netlink port API
 - Fix the cleanup path in the netlink port API

V1: https://lore.kernel.org/netdev/20260127134202.8208-1-maxime.chevallier@bootlin.com/

Maxime Chevallier (10):
  net: phy: phy_link_topology: Add a helper for opportunistic alloc
  net: phy: phy_link_topology: Track ports in phy_link_topology
  net: phylink: Register a phy_port for MAC-driven SFP cages
  net: phy: Create SFP phy_port before registering upstream
  net: phy: Represent PHY-less SFP modules with phy_port
  net: phy: phy_port: Store information about a port's upstream
  net: phy: phy_link_topology: Add a helper to retrieve ports
  netlink: specs: Add ethernet port listing with ethtool
  net: ethtool: Introduce ethtool command to list ports
  Documentation: networking: Update the phy_port infrastructure
    description

 Documentation/netlink/specs/ethtool.yaml      |  55 +++
 Documentation/networking/ethtool-netlink.rst  |  34 ++
 Documentation/networking/phy-port.rst         |  26 +-
 MAINTAINERS                                   |   1 +
 drivers/net/phy/phy-caps.h                    |   2 +
 drivers/net/phy/phy_caps.c                    |  26 ++
 drivers/net/phy/phy_device.c                  | 186 +++++++--
 drivers/net/phy/phy_link_topology.c           | 101 ++++-
 drivers/net/phy/phylink.c                     | 128 +++++-
 include/linux/phy.h                           |  10 +
 include/linux/phy_link_topology.h             |  44 ++
 include/linux/phy_port.h                      |   5 +
 .../uapi/linux/ethtool_netlink_generated.h    |  22 +
 net/core/dev.c                                |   1 +
 net/ethtool/Makefile                          |   2 +-
 net/ethtool/netlink.c                         |  25 ++
 net/ethtool/netlink.h                         |   8 +
 net/ethtool/port.c                            | 382 ++++++++++++++++++
 18 files changed, 1020 insertions(+), 38 deletions(-)
 create mode 100644 net/ethtool/port.c

-- 
2.55.0
Re: [PATCH net-next v17 00/10] net: phy_port: SFP modules representation and phy_port listing
Posted by Maxime Chevallier 2 weeks, 2 days ago
Hi,

On 9/9/26 11:39, Maxime Chevallier wrote:
> Hello everyone,
> 
> Here's V17 for the phy_port improved SFP support and netlink interface.

Looks like I got ratelimited by my mail provider, it's the second series
today that partially makes it to the ML :(

I'll resend after 24h cooldown,

Maxime

> 
> V17 addresses the port_id wrapparound with the xarray insertion, and the
> missing comment during the ethtool header regen from the YNL specs.
> 
> 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, marked as 'occupied'
>  - 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 !
> 
> Maxime
> 
> [1] : https://github.com/minimaxwell/ethtool/tree/mc/ethtool_port
> 
> Changelog :
> 
> Changes in v17:
>  - Handle port index wraparound
>  - Regen the ethtool headers, now with the comment :)
> 
> Changes in v16:
> https://lore.kernel.org/r/20260902212135.1805948-1-maxime.chevallier@bootlin.com
>  - unregister phy_ports at phy_detach
>  - typos in patch 1 (of -> or)
>  - Fix the netlink specs
> 
> Changes in v15:
> https://lore.kernel.org/netdev/20260801074332.98755-1-maxime.chevallier@bootlin.com/
>  - Fail on port access for ops-locked devices
>  - Use a direct phy_port pointer for upstream tracking
>  - Addressed the kdoc issues
> 
> Changes in v14:
> https://lore.kernel.org/netdev/20260720174808.139573-1-maxime.chevallier@bootlin.com/
>  - Added a big comment on the first patch for the topo alloc potential
>    races
>  - Fixed the multi-buff DUMP on last patch with a separate iterator for
>    dumps
>  - Fixed some typos in the documentation
> 
> Changes in V13:
> V13: https://lore.kernel.org/r/20260701110427.143945-1-maxime.chevallier@bootlin.com
>  - Rebase on net-next
>  - Fix the SFP bus cleanup path in patch 5
> 
> Changes in V12:
> V12: https://lore.kernel.org/r/20260615153907.862987-1-maxime.chevallier@bootlin.com
>  - Rebased on net-next, including fixes on the phy probing and cleanup
>    paths
>  - Rebased on Jakub's netdev_ops_locked changes in phy_link_topology
>  - Fixed some typos reported by Andrew and sashiko in the documentation
> 
> Changes in v11:
> V11:https://lore.kernel.org/r/20260521121040.1199622-1-maxime.chevallier@bootlin.com
>  - Aggregated Andrew's reviews :)
>  - Removed the "vacant" field, replaced it with "upstream_port"
> 
> Changes in V10:
> V10: https://lore.kernel.org/r/20260513130521.1064094-1-maxime.chevallier@bootlin.com
>  - Rebase on net-next
>  - Rename phylink/phy_device sfp_bus_port to sfp_cage_port
>  - Sashiko's reviews were mostly unrealistic or wrong :(
> 
> Changes in V9:
> V9: https://lore.kernel.org/r/20260403123755.175742-1-maxime.chevallier@bootlin.com
>  - Added missing netlink doc updates for u8->u32 conversion
>  - Removed dead code with a condition that can never be true in
>    phylink's mod_port code
>  - Fixed the error path in phy_sfp_connect_phy
> 
> Changes in v8:
> V8: https://lore.kernel.org/r/20260325081937.571115-1-maxime.chevallier@bootlin.com
>  - Set the new phydev.has_sfp_mod_phy field when we're sure that no
>    errors occured
>  - Fix formatting of the copyright info in ethnl port
>  - Use a policy to validate the range of port_id
>  - Use GENL_REQ_ATTR_CHECK
>  - alpha-sort headers
>  - use u32 in netlink messages
>  - return better error codes
>  - don't check the skb len, the core does that
> 
> Changes in V7:
> V7: https://lore.kernel.org/all/20260309152747.702373-1-maxime.chevallier@bootlin.com/
>  - Changed the port cleanup path to use list_for_each_entry_continue_reverse
>  - Adjusted the cleanup path in phylink for the port vacant state
>  - Pass the right cmd for the netlink dump message
> 
> Changes in V6:
> V6: https://lore.kernel.org/r/20260304145444.442334-1-maxime.chevallier@bootlin.com
>  - Added some comments in th mod_port cleanup
>  - changed some kmalloc to kmalloc_obj
>  - Removed some phy_link_topo_del_port that wasn't needed
> 
> Changes in V5:
> V5: https://lore.kernel.org/r/20260205092317.755906-1-maxime.chevallier@bootlin.com
>  - Fixed a check on a potentially un-initialized pointer, reported by
>    Simon
>  - Fixed a documentation formatting issue
>  - Remove a stray pr_info
>  - Rebased on net-next
> 
> Changes in V4:
> V4 : https://lore.kernel.org/netdev/20260203172839.548524-1-maxime.chevallier@bootlin.com/
>  - Add a cleanup patch for the of port parsing
>  - Added a match to sync the port's linkmodes with the PHY's for OF
>    ports
>  - Added RTNL assert in the port_get topo helper
>  - nullify the bus port for phylink support
>  - Fix some typos
> 
> Changes in V3:
> V3: https://lore.kernel.org/netdev/20260201151249.642015-1-maxime.chevallier@bootlin.com/
>  - Remove the sfp bus ops for nophy, and use .module_start() as
>    suggested by Russell
>  - Added missing cleanup for the topology, as per AI review
>  - Fixed a few typos as per Romain's review
>  - Changed "occupied" to "vacant" as per Romain's review
>  - Added missing checks for null ports, per AI review
> 
> Changes in V2:
> V2: https://lore.kernel.org/netdev/20260128204526.170927-1-maxime.chevallier@bootlin.com/
>  - Fix the cleanup path of phy_link_topo_add_phy, as per AI review
>  - Fix the cleanup path of phy_sfp_probe, as per AI review
>  - Fix the call-site of the disconnect_nophy sfp bus ops, per AI review
>  - Fix the netdev-less case uin phylink, per AI review
>  - Fix the prototype of phy_link_topo_get_port for the stubs
>  - Dropped patch 11. It ended-up breaking 'allnoconfig', so instead we
>    built a phy_interface_names array in net/ethtool/netlink.c
>  - Fix an ethool-netlink spec discrepancy with the type of an attribute
>  - Fix the size computation in the netlink port API
>  - Fix the cleanup path in the netlink port API
> 
> V1: https://lore.kernel.org/netdev/20260127134202.8208-1-maxime.chevallier@bootlin.com/
> 
> Maxime Chevallier (10):
>   net: phy: phy_link_topology: Add a helper for opportunistic alloc
>   net: phy: phy_link_topology: Track ports in phy_link_topology
>   net: phylink: Register a phy_port for MAC-driven SFP cages
>   net: phy: Create SFP phy_port before registering upstream
>   net: phy: Represent PHY-less SFP modules with phy_port
>   net: phy: phy_port: Store information about a port's upstream
>   net: phy: phy_link_topology: Add a helper to retrieve ports
>   netlink: specs: Add ethernet port listing with ethtool
>   net: ethtool: Introduce ethtool command to list ports
>   Documentation: networking: Update the phy_port infrastructure
>     description
> 
>  Documentation/netlink/specs/ethtool.yaml      |  55 +++
>  Documentation/networking/ethtool-netlink.rst  |  34 ++
>  Documentation/networking/phy-port.rst         |  26 +-
>  MAINTAINERS                                   |   1 +
>  drivers/net/phy/phy-caps.h                    |   2 +
>  drivers/net/phy/phy_caps.c                    |  26 ++
>  drivers/net/phy/phy_device.c                  | 186 +++++++--
>  drivers/net/phy/phy_link_topology.c           | 101 ++++-
>  drivers/net/phy/phylink.c                     | 128 +++++-
>  include/linux/phy.h                           |  10 +
>  include/linux/phy_link_topology.h             |  44 ++
>  include/linux/phy_port.h                      |   5 +
>  .../uapi/linux/ethtool_netlink_generated.h    |  22 +
>  net/core/dev.c                                |   1 +
>  net/ethtool/Makefile                          |   2 +-
>  net/ethtool/netlink.c                         |  25 ++
>  net/ethtool/netlink.h                         |   8 +
>  net/ethtool/port.c                            | 382 ++++++++++++++++++
>  18 files changed, 1020 insertions(+), 38 deletions(-)
>  create mode 100644 net/ethtool/port.c
>