| .. SPDX-License-Identifier: GPL-2.0 |
| .. _phy_port: |
| |
| ================= |
| Ethernet ports |
| ================= |
| |
| This document is a basic description of the phy_port infrastructure, |
| introduced to represent physical interfaces of Ethernet devices. |
| |
| Without phy_port, we already have quite a lot of information about what the |
| media-facing interface of a NIC can do and looks like, through the |
| :c:type:`struct ethtool_link_ksettings <ethtool_link_ksettings>` attributes, |
| which includes : |
| |
| - What the NIC can do through the :c:member:`supported` field |
| - What the Link Partner advertises through :c:member:`lp_advertising` |
| - Which features we're advertising through :c:member:`advertising` |
| |
| We also have info about the number of pairs and the PORT type. These settings |
| are built by aggregating together information reported by various devices that |
| are sitting on the link : |
| |
| - The NIC itself, through the :c:member:`get_link_ksettings` callback |
| - Precise information from the MAC and PCS by using phylink in the MAC driver |
| - Information reported by the PHY device |
| - Information reported by an SFP module (which can itself include a PHY) |
| |
| This model however starts showing its limitations when we consider devices that |
| have more than one media interface. In such a case, only information about the |
| actively used interface is reported, and it's not possible to know what the |
| other interfaces can do. In fact, we have very little information about whether |
| or not there are any other media interfaces. |
| |
| The goal of the phy_port representation is to provide a way of representing a |
| physical interface of a NIC, regardless of what is driving the port (NIC through |
| a firmware, SFP module, Ethernet PHY). |
| |
| Multi-port interfaces examples |
| ============================== |
| |
| Several cases of multi-interface NICs have been observed so far : |
| |
| Internal MII Mux:: |
| |
| +------------------+ |
| | SoC | |
| | +-----+ | +-----+ |
| | +-----+ | |-------------| PHY | |
| | | MAC |--| Mux | | +-----+ +-----+ |
| | +-----+ | |-----| SFP | |
| | +-----+ | +-----+ |
| +------------------+ |
| |
| Internal Mux with internal PHY:: |
| |
| +------------------------+ |
| | SoC | |
| | +-----+ +-----+ |
| | +-----+ | |-| PHY | |
| | | MAC |--| Mux | +-----+ +-----+ |
| | +-----+ | |-----------| SFP | |
| | +-----+ | +-----+ |
| +------------------------+ |
| |
| External Mux:: |
| |
| +---------+ |
| | SoC | +-----+ +-----+ |
| | | | |--| PHY | |
| | +-----+ | | | +-----+ |
| | | MAC |----| Mux | +-----+ |
| | +-----+ | | |--| PHY | |
| | | +-----+ +-----+ |
| | | | |
| | GPIO-------+ |
| +---------+ |
| |
| Double-port PHY:: |
| |
| +---------+ |
| | SoC | +-----+ |
| | | | |--- RJ45 |
| | +-----+ | | | |
| | | MAC |---| PHY | +-----+ |
| | +-----+ | | |---| SFP | |
| +---------+ +-----+ +-----+ |
| |
| phy_port aims at providing a path to support all the above topologies, by |
| representing the media interfaces in a way that's agnostic to what's driving |
| the interface. the struct phy_port object has its own set of callback ops, and |
| will eventually be able to report its own ksettings:: |
| |
| _____ +------+ |
| ( )-----| Port | |
| +-----+ ( ) +------+ |
| | MAC |--( ??? ) |
| +-----+ ( ) +------+ |
| (_____)-----| Port | |
| +------+ |
| |
| Next steps |
| ========== |
| |
| As of writing this documentation, only ports controlled by PHY devices are |
| supported. The next steps will be to add the Netlink API to expose these |
| to userspace and add support for raw ports (controlled by some firmware, and directly |
| managed by the NIC driver). |
| |
| Another parallel task is the introduction of a MII muxing framework to allow the |
| control of non-PHY driver multi-port setups. |