| From foo@baz Wed Sep 30 05:25:07 CEST 2015 |
| From: Stas Sergeev <stsp@list.ru> |
| Date: Mon, 20 Jul 2015 17:49:57 -0700 |
| Subject: of_mdio: add new DT property 'managed' to specify the PHY management type |
| |
| From: Stas Sergeev <stsp@list.ru> |
| |
| [ Upstream commit 4cba5c2103657d43d0886e4cff8004d95a3d0def in net-next tree, |
| will be pushed to Linus very soon. ] |
| |
| Currently the PHY management type is selected by the MAC driver arbitrary. |
| The decision is based on the presence of the "fixed-link" node and on a |
| will of the driver's authors. |
| This caused a regression recently, when mvneta driver suddenly started |
| to use the in-band status for auto-negotiation on fixed links. |
| It appears the auto-negotiation may not work when expected by the MAC driver. |
| Sebastien Rannou explains: |
| << Yes, I confirm that my HW does not generate an in-band status. AFAIK, it's |
| a PHY that aggregates 4xSGMIIs to 1xQSGMII ; the MAC side of the PHY (with |
| inband status) is connected to the switch through QSGMII, and in this context |
| we are on the media side of the PHY. >> |
| https://lkml.org/lkml/2015/7/10/206 |
| |
| This patch introduces the new string property 'managed' that allows |
| the user to set the management type explicitly. |
| The supported values are: |
| "auto" - default. Uses either MDIO or nothing, depending on the presence |
| of the fixed-link node |
| "in-band-status" - use in-band status |
| |
| Signed-off-by: Stas Sergeev <stsp@users.sourceforge.net> |
| |
| CC: Rob Herring <robh+dt@kernel.org> |
| CC: Pawel Moll <pawel.moll@arm.com> |
| CC: Mark Rutland <mark.rutland@arm.com> |
| CC: Ian Campbell <ijc+devicetree@hellion.org.uk> |
| CC: Kumar Gala <galak@codeaurora.org> |
| CC: Florian Fainelli <f.fainelli@gmail.com> |
| CC: Grant Likely <grant.likely@linaro.org> |
| CC: devicetree@vger.kernel.org |
| CC: linux-kernel@vger.kernel.org |
| CC: netdev@vger.kernel.org |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| Documentation/devicetree/bindings/net/ethernet.txt | 4 ++++ |
| drivers/of/of_mdio.c | 19 +++++++++++++++++-- |
| 2 files changed, 21 insertions(+), 2 deletions(-) |
| |
| --- a/Documentation/devicetree/bindings/net/ethernet.txt |
| +++ b/Documentation/devicetree/bindings/net/ethernet.txt |
| @@ -25,7 +25,11 @@ The following properties are common to t |
| flow control thresholds. |
| - tx-fifo-depth: the size of the controller's transmit fifo in bytes. This |
| is used for components that can have configurable fifo sizes. |
| +- managed: string, specifies the PHY management type. Supported values are: |
| + "auto", "in-band-status". "auto" is the default, it usess MDIO for |
| + management if fixed-link is not specified. |
| |
| Child nodes of the Ethernet controller are typically the individual PHY devices |
| connected via the MDIO bus (sometimes the MDIO bus controller is separate). |
| They are described in the phy.txt file in this same directory. |
| +For non-MDIO PHY management see fixed-link.txt. |
| --- a/drivers/of/of_mdio.c |
| +++ b/drivers/of/of_mdio.c |
| @@ -266,7 +266,8 @@ EXPORT_SYMBOL(of_phy_attach); |
| bool of_phy_is_fixed_link(struct device_node *np) |
| { |
| struct device_node *dn; |
| - int len; |
| + int len, err; |
| + const char *managed; |
| |
| /* New binding */ |
| dn = of_get_child_by_name(np, "fixed-link"); |
| @@ -275,6 +276,10 @@ bool of_phy_is_fixed_link(struct device_ |
| return true; |
| } |
| |
| + err = of_property_read_string(np, "managed", &managed); |
| + if (err == 0 && strcmp(managed, "auto") != 0) |
| + return true; |
| + |
| /* Old binding */ |
| if (of_get_property(np, "fixed-link", &len) && |
| len == (5 * sizeof(__be32))) |
| @@ -289,8 +294,18 @@ int of_phy_register_fixed_link(struct de |
| struct fixed_phy_status status = {}; |
| struct device_node *fixed_link_node; |
| const __be32 *fixed_link_prop; |
| - int len; |
| + int len, err; |
| struct phy_device *phy; |
| + const char *managed; |
| + |
| + err = of_property_read_string(np, "managed", &managed); |
| + if (err == 0) { |
| + if (strcmp(managed, "in-band-status") == 0) { |
| + /* status is zeroed, namely its .link member */ |
| + phy = fixed_phy_register(PHY_POLL, &status, np); |
| + return IS_ERR(phy) ? PTR_ERR(phy) : 0; |
| + } |
| + } |
| |
| /* New binding */ |
| fixed_link_node = of_get_child_by_name(np, "fixed-link"); |