lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 478/633] netsec: ignore phy-mode device property on ACPI systems
    Date
    From: Ard Biesheuvel <ardb@kernel.org>

    [ Upstream commit acd7aaf51b20263a7e62d2a26569988c63bdd3d8 ]

    Since commit bbc4d71d63549bc ("net: phy: realtek: fix rtl8211e rx/tx
    delay config"), the Realtek PHY driver will override any TX/RX delay
    set by hardware straps if the phy-mode device property does not match.

    This is causing problems on SynQuacer based platforms (the only SoC
    that incorporates the netsec hardware), since many were built with
    this Realtek PHY, and shipped with firmware that defines the phy-mode
    as 'rgmii', even though the PHY is configured for TX and RX delay using
    pull-ups.

    >From the driver's perspective, we should not make any assumptions in
    the general case that the PHY hardware does not require any initial
    configuration. However, the situation is slightly different for ACPI
    boot, since it implies rich firmware with AML abstractions to handle
    hardware details that are not exposed to the OS. So in the ACPI case,
    it is reasonable to assume that the PHY comes up in the right mode,
    regardless of whether the mode is set by straps, by boot time firmware
    or by AML executed by the ACPI interpreter.

    So let's ignore the 'phy-mode' device property when probing the netsec
    driver in ACPI mode, and hardcode the mode to PHY_INTERFACE_MODE_NA,
    which should work with any PHY provided that it is configured by the
    time the driver attaches to it. While at it, document that omitting
    the mode is permitted for DT probing as well, by setting the phy-mode
    DT property to the empty string.

    Fixes: 533dd11a12f6 ("net: socionext: Add Synquacer NetSec driver")
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Link: https://lore.kernel.org/r/20201018163625.2392-1-ardb@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../bindings/net/socionext-netsec.txt | 4 +++-
    drivers/net/ethernet/socionext/netsec.c | 24 +++++++++++++------
    2 files changed, 20 insertions(+), 8 deletions(-)

    diff --git a/Documentation/devicetree/bindings/net/socionext-netsec.txt b/Documentation/devicetree/bindings/net/socionext-netsec.txt
    index 9d6c9feb12ff1..a3c1dffaa4bb4 100644
    --- a/Documentation/devicetree/bindings/net/socionext-netsec.txt
    +++ b/Documentation/devicetree/bindings/net/socionext-netsec.txt
    @@ -30,7 +30,9 @@ Optional properties: (See ethernet.txt file in the same directory)
    - max-frame-size: See ethernet.txt in the same directory.

    The MAC address will be determined using the optional properties
    -defined in ethernet.txt.
    +defined in ethernet.txt. The 'phy-mode' property is required, but may
    +be set to the empty string if the PHY configuration is programmed by
    +the firmware or set by hardware straps, and needs to be preserved.

    Example:
    eth0: ethernet@522d0000 {
    diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c
    index 0f366cc50b74c..7f8be61a37089 100644
    --- a/drivers/net/ethernet/socionext/netsec.c
    +++ b/drivers/net/ethernet/socionext/netsec.c
    @@ -6,6 +6,7 @@
    #include <linux/pm_runtime.h>
    #include <linux/acpi.h>
    #include <linux/of_mdio.h>
    +#include <linux/of_net.h>
    #include <linux/etherdevice.h>
    #include <linux/interrupt.h>
    #include <linux/io.h>
    @@ -1836,6 +1837,14 @@ static const struct net_device_ops netsec_netdev_ops = {
    static int netsec_of_probe(struct platform_device *pdev,
    struct netsec_priv *priv, u32 *phy_addr)
    {
    + int err;
    +
    + err = of_get_phy_mode(pdev->dev.of_node, &priv->phy_interface);
    + if (err) {
    + dev_err(&pdev->dev, "missing required property 'phy-mode'\n");
    + return err;
    + }
    +
    priv->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
    if (!priv->phy_np) {
    dev_err(&pdev->dev, "missing required property 'phy-handle'\n");
    @@ -1862,6 +1871,14 @@ static int netsec_acpi_probe(struct platform_device *pdev,
    if (!IS_ENABLED(CONFIG_ACPI))
    return -ENODEV;

    + /* ACPI systems are assumed to configure the PHY in firmware, so
    + * there is really no need to discover the PHY mode from the DSDT.
    + * Since firmware is known to exist in the field that configures the
    + * PHY correctly but passes the wrong mode string in the phy-mode
    + * device property, we have no choice but to ignore it.
    + */
    + priv->phy_interface = PHY_INTERFACE_MODE_NA;
    +
    ret = device_property_read_u32(&pdev->dev, "phy-channel", phy_addr);
    if (ret) {
    dev_err(&pdev->dev,
    @@ -1998,13 +2015,6 @@ static int netsec_probe(struct platform_device *pdev)
    priv->msg_enable = NETIF_MSG_TX_ERR | NETIF_MSG_HW | NETIF_MSG_DRV |
    NETIF_MSG_LINK | NETIF_MSG_PROBE;

    - priv->phy_interface = device_get_phy_mode(&pdev->dev);
    - if ((int)priv->phy_interface < 0) {
    - dev_err(&pdev->dev, "missing required property 'phy-mode'\n");
    - ret = -ENODEV;
    - goto free_ndev;
    - }
    -
    priv->ioaddr = devm_ioremap(&pdev->dev, mmio_res->start,
    resource_size(mmio_res));
    if (!priv->ioaddr) {
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:10    [W:4.147 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site