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  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20191227213626.4404-6-olteanv@gmail.com>
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ