lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 738/849] net: phy: fix duplex out of sync problem while changing settings
    Date
    From: Heiner Kallweit <hkallweit1@gmail.com>

    [ Upstream commit a4db9055fdb9cf607775c66d39796caf6439ec92 ]

    As reported by Zhang there's a small issue if in forced mode the duplex
    mode changes with the link staying up [0]. In this case the MAC isn't
    notified about the change.

    The proposed patch relies on the phylib state machine and ignores the
    fact that there are drivers that uses phylib but not the phylib state
    machine. So let's don't change the behavior for such drivers and fix
    it w/o re-adding state PHY_FORCING for the case that phylib state
    machine is used.

    [0] https://lore.kernel.org/netdev/a5c26ffd-4ee4-a5e6-4103-873208ce0dc5@huawei.com/T/

    Fixes: 2bd229df5e2e ("net: phy: remove state PHY_FORCING")
    Reported-by: Zhang Changzhong <zhangchangzhong@huawei.com>
    Tested-by: Zhang Changzhong <zhangchangzhong@huawei.com>
    Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
    Link: https://lore.kernel.org/r/7b8b9456-a93f-abbc-1dc5-a2c2542f932c@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/phy/phy.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
    index cbf344c5db610..451adee132139 100644
    --- a/drivers/net/phy/phy.c
    +++ b/drivers/net/phy/phy.c
    @@ -815,7 +815,12 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev,
    phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl;

    /* Restart the PHY */
    - _phy_start_aneg(phydev);
    + if (phy_is_started(phydev)) {
    + phydev->state = PHY_UP;
    + phy_trigger_machine(phydev);
    + } else {
    + _phy_start_aneg(phydev);
    + }

    mutex_unlock(&phydev->lock);
    return 0;
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 02:41    [W:2.823 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site