lkml.org 
[lkml]   [2018]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 045/135] net: phy: phylink: fix SFP interface autodetection
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Baruch Siach <baruch@tkos.co.il>

    [ Upstream commit 7e4183752735deb7543e179a44f4f4b44917cd6f ]

    When connecting SFP PHY to phylink use the detected interface.
    Otherwise, the link fails to come up when the configured 'phy-mode'
    differs from the SFP detected mode.

    Move most of phylink_connect_phy() into __phylink_connect_phy(), and
    leave phylink_connect_phy() as a wrapper. phylink_sfp_connect_phy() can
    now pass the SFP detected PHY interface to __phylink_connect_phy().

    This fixes 1GB SFP module link up on eth3 of the Macchiatobin board that
    is configured in the DT to "2500base-x" phy-mode.

    Fixes: 9525ae83959b6 ("phylink: add phylink infrastructure")
    Suggested-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Baruch Siach <baruch@tkos.co.il>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/phy/phylink.c | 48 ++++++++++++++++++++++++++--------------------
    1 file changed, 28 insertions(+), 20 deletions(-)

    --- a/drivers/net/phy/phylink.c
    +++ b/drivers/net/phy/phylink.c
    @@ -717,6 +717,30 @@ static int phylink_bringup_phy(struct ph
    return 0;
    }

    +static int __phylink_connect_phy(struct phylink *pl, struct phy_device *phy,
    + phy_interface_t interface)
    +{
    + int ret;
    +
    + if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED ||
    + (pl->link_an_mode == MLO_AN_INBAND &&
    + phy_interface_mode_is_8023z(interface))))
    + return -EINVAL;
    +
    + if (pl->phydev)
    + return -EBUSY;
    +
    + ret = phy_attach_direct(pl->netdev, phy, 0, interface);
    + if (ret)
    + return ret;
    +
    + ret = phylink_bringup_phy(pl, phy);
    + if (ret)
    + phy_detach(phy);
    +
    + return ret;
    +}
    +
    /**
    * phylink_connect_phy() - connect a PHY to the phylink instance
    * @pl: a pointer to a &struct phylink returned from phylink_create()
    @@ -734,31 +758,13 @@ static int phylink_bringup_phy(struct ph
    */
    int phylink_connect_phy(struct phylink *pl, struct phy_device *phy)
    {
    - int ret;
    -
    - if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED ||
    - (pl->link_an_mode == MLO_AN_INBAND &&
    - phy_interface_mode_is_8023z(pl->link_interface))))
    - return -EINVAL;
    -
    - if (pl->phydev)
    - return -EBUSY;
    -
    /* Use PHY device/driver interface */
    if (pl->link_interface == PHY_INTERFACE_MODE_NA) {
    pl->link_interface = phy->interface;
    pl->link_config.interface = pl->link_interface;
    }

    - ret = phy_attach_direct(pl->netdev, phy, 0, pl->link_interface);
    - if (ret)
    - return ret;
    -
    - ret = phylink_bringup_phy(pl, phy);
    - if (ret)
    - phy_detach(phy);
    -
    - return ret;
    + return __phylink_connect_phy(pl, phy, pl->link_interface);
    }
    EXPORT_SYMBOL_GPL(phylink_connect_phy);

    @@ -1672,7 +1678,9 @@ static void phylink_sfp_link_up(void *up

    static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
    {
    - return phylink_connect_phy(upstream, phy);
    + struct phylink *pl = upstream;
    +
    + return __phylink_connect_phy(upstream, phy, pl->link_config.interface);
    }

    static void phylink_sfp_disconnect_phy(void *upstream)

    \
     
     \ /
      Last update: 2018-10-16 19:43    [W:2.989 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site