lkml.org 
[lkml]   [2019]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 15/94] Add genphy_c45_config_aneg() function to phy-c45.c
    Date
    From: Marco Hartmann <marco.hartmann@nxp.com>

    [ Upstream commit 2ebb991641d3f64b70fec0156e2b6933810177e9 ]

    Commit 34786005eca3 ("net: phy: prevent PHYs w/o Clause 22 regs from calling
    genphy_config_aneg") introduced a check that aborts phy_config_aneg()
    if the phy is a C45 phy.
    This causes phy_state_machine() to call phy_error() so that the phy
    ends up in PHY_HALTED state.

    Instead of returning -EOPNOTSUPP, call genphy_c45_config_aneg()
    (analogous to the C22 case) so that the state machine can run
    correctly.

    genphy_c45_config_aneg() closely resembles mv3310_config_aneg()
    in drivers/net/phy/marvell10g.c, excluding vendor specific
    configurations for 1000BaseT.

    Fixes: 22b56e827093 ("net: phy: replace genphy_10g_driver with genphy_c45_driver")

    Signed-off-by: Marco Hartmann <marco.hartmann@nxp.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/phy/phy-c45.c | 26 ++++++++++++++++++++++++++
    drivers/net/phy/phy.c | 2 +-
    include/linux/phy.h | 1 +
    3 files changed, 28 insertions(+), 1 deletion(-)

    --- a/drivers/net/phy/phy-c45.c
    +++ b/drivers/net/phy/phy-c45.c
    @@ -523,6 +523,32 @@ int genphy_c45_read_status(struct phy_de
    }
    EXPORT_SYMBOL_GPL(genphy_c45_read_status);

    +/**
    + * genphy_c45_config_aneg - restart auto-negotiation or forced setup
    + * @phydev: target phy_device struct
    + *
    + * Description: If auto-negotiation is enabled, we configure the
    + * advertising, and then restart auto-negotiation. If it is not
    + * enabled, then we force a configuration.
    + */
    +int genphy_c45_config_aneg(struct phy_device *phydev)
    +{
    + bool changed = false;
    + int ret;
    +
    + if (phydev->autoneg == AUTONEG_DISABLE)
    + return genphy_c45_pma_setup_forced(phydev);
    +
    + ret = genphy_c45_an_config_aneg(phydev);
    + if (ret < 0)
    + return ret;
    + if (ret > 0)
    + changed = true;
    +
    + return genphy_c45_check_and_restart_aneg(phydev, changed);
    +}
    +EXPORT_SYMBOL_GPL(genphy_c45_config_aneg);
    +
    /* The gen10g_* functions are the old Clause 45 stub */

    int gen10g_config_aneg(struct phy_device *phydev)
    --- a/drivers/net/phy/phy.c
    +++ b/drivers/net/phy/phy.c
    @@ -499,7 +499,7 @@ static int phy_config_aneg(struct phy_de
    * allowed to call genphy_config_aneg()
    */
    if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0)))
    - return -EOPNOTSUPP;
    + return genphy_c45_config_aneg(phydev);

    return genphy_config_aneg(phydev);
    }
    --- a/include/linux/phy.h
    +++ b/include/linux/phy.h
    @@ -1108,6 +1108,7 @@ int genphy_c45_an_disable_aneg(struct ph
    int genphy_c45_read_mdix(struct phy_device *phydev);
    int genphy_c45_pma_read_abilities(struct phy_device *phydev);
    int genphy_c45_read_status(struct phy_device *phydev);
    +int genphy_c45_config_aneg(struct phy_device *phydev);

    /* The gen10g_* functions are the old Clause 45 stub */
    int gen10g_config_aneg(struct phy_device *phydev);

    \
     
     \ /
      Last update: 2019-09-08 14:55    [W:2.410 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site