lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 27 Dec 2019 23:36:20 +0200 From: Vladimir Oltean <olteanv@...il.com> To: davem@...emloft.net, jakub.kicinski@...ronome.com, linux@...linux.org.uk, andrew@...n.ch, f.fainelli@...il.com, vivien.didelot@...il.com Cc: alexandru.marginean@....com, claudiu.manoil@....com, xiaoliang.yang_1@....com, yangbo.lu@....com, netdev@...r.kernel.org, alexandre.belloni@...tlin.com, horatiu.vultur@...rochip.com, UNGLinuxDriver@...rochip.com, Vladimir Oltean <vladimir.oltean@....com> Subject: [PATCH v3 net-next 05/11] net: phy: Add a property for controlling in-band auto-negotiation From: Vladimir Oltean <vladimir.oltean@....com> This patch aims to solve a simple problem: for SerDes interfaces, the MAC has a PCS layer which serializes the data before passing it to the link partner (typically a PHY with its own PCS, but not necessarily, it can also be a remote PHY). Some of these SerDes protocols have a configuration word that is transmitted in-band, to establish the link parameters. Some SerDes implementations strictly require this handshake (in-band AN) to complete before passing data, while on others it may be bypassed. >From a user perspective, the top-most entity of this in-band AN relationship is the MAC PCS, driven by an Ethernet driver. When the MAC PCS operates as PHY-less, there is little that can be done from our side to prevent a settings mismatch, since the link partner may be remote and outside our control. When the MAC PCS is connected to a PHY driven by the PHY library, that is when we want to ensure the in-band AN settings are in sync and can be fulfilled by both parties. This setting is ternary and requested by the MAC PCS driver. For compatibility with existing code, we introduce a IN_BAND_AN_DEFAULT state equal to 0, which means that the MAC driver, caller of the PHY library, has no opinion about in-band AN settings. It is assumed that somebody else has taken care of this setting and nothing should be done. When the PHYLIB caller requests an explicit setting (IN_BAND_AN_ENABLED or IN_BAND_AN_DISABLED), the PHY driver must veto this operation in its .config_init callback if it can't do as requested. As mentioned, this is to avoid mismatches, which will be taken to result in failure to pass data between MAC and PHY. As for the caller of PHYLIB, it shouldn't hardcode any particular value for phydev->in_band_autoneg, but rather take this information from a board description file such as device tree. This gives the caller a chance to veto the setting as well, if it doesn't support it, and it leaves the choice at the level of individual MAC-PHY instances instead of drivers. A more-or-less standard device tree binding that can be used to gather this information is: managed = "in-band-status"; which PHYLINK already uses. Make PHYLINK the first user of this scheme, by parsing the DT binding mentioned above and passing it to the PHY library. Signed-off-by: Vladimir Oltean <vladimir.oltean@....com> --- Changes in v3: - Patch is new. drivers/net/phy/phylink.c | 2 ++ include/linux/phy.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index 73a01ea5fc55..af574d5a8426 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -878,6 +878,8 @@ int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, if (!phy_dev) return -ENODEV; + phy_dev->in_band_autoneg = (pl->cfg_link_an_mode == MLO_AN_INBAND); + ret = phy_attach_direct(pl->netdev, phy_dev, flags, pl->link_interface); if (ret) diff --git a/include/linux/phy.h b/include/linux/phy.h index 30e599c454db..090e4ba303e2 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -318,6 +318,22 @@ enum phy_state { PHY_NOLINK, }; +/* Settings for system-side PHY auto-negotiation: + * - IN_BAND_AN_DEFAULT: the PHY is left in the default configuration, be it + * out-of-reset, preconfigured by boot firmware, etc. In-band AN can be + * disabled, enabled or even unsupported when this setting is on. + * - IN_BAND_AN_ENABLED: the PHY must enable system-side auto-negotiation with + * the attached MAC, or veto this setting if it can't. + * - IN_BAND_AN_DISABLED: the PHY must disable or bypass system-side + * auto-negotiation with the attached MAC (and force the link settings if + * applicable), or veto this setting if it can't. + */ +enum phy_in_band_autoneg { + IN_BAND_AN_DEFAULT = 0, + IN_BAND_AN_ENABLED, + IN_BAND_AN_DISABLED, +}; + /** * struct phy_c45_device_ids - 802.3-c45 Device Identifiers * @devices_in_package: Bit vector of devices present. @@ -388,6 +404,8 @@ struct phy_device { /* Interrupts are enabled */ unsigned interrupts:1; + enum phy_in_band_autoneg in_band_autoneg; + enum phy_state state; u32 dev_flags; -- 2.17.1
Powered by blists - more mailing lists