| From 0b314ceca8f864a96744564b96404426d7584c33 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 22 Apr 2021 13:46:43 +0300 |
| Subject: net: phy: marvell: fix m88e1011_set_downshift |
| |
| From: Maxim Kochetkov <fido_max@inbox.ru> |
| |
| [ Upstream commit 990875b299b8612aeb85cb2e2751796f1add65ff ] |
| |
| Changing downshift params without software reset has no effect, |
| so call genphy_soft_reset() after change downshift params. |
| |
| As the datasheet says: |
| Changes to these bits are disruptive to the normal operation therefore, |
| any changes to these registers must be followed by software reset |
| to take effect. |
| |
| Fixes: 911af5e149bb ("net: phy: marvell: fix downshift function naming") |
| Signed-off-by: Maxim Kochetkov <fido_max@inbox.ru> |
| Reviewed-by: Andrew Lunn <andrew@lunn.ch> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/phy/marvell.c | 26 ++++++++++++++++---------- |
| 1 file changed, 16 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c |
| index 163767abceea..04e7b9a7799c 100644 |
| --- a/drivers/net/phy/marvell.c |
| +++ b/drivers/net/phy/marvell.c |
| @@ -1022,22 +1022,28 @@ static int m88e1011_get_downshift(struct phy_device *phydev, u8 *data) |
| |
| static int m88e1011_set_downshift(struct phy_device *phydev, u8 cnt) |
| { |
| - int val; |
| + int val, err; |
| |
| if (cnt > MII_M1011_PHY_SCR_DOWNSHIFT_MAX) |
| return -E2BIG; |
| |
| - if (!cnt) |
| - return phy_clear_bits(phydev, MII_M1011_PHY_SCR, |
| - MII_M1011_PHY_SCR_DOWNSHIFT_EN); |
| + if (!cnt) { |
| + err = phy_clear_bits(phydev, MII_M1011_PHY_SCR, |
| + MII_M1011_PHY_SCR_DOWNSHIFT_EN); |
| + } else { |
| + val = MII_M1011_PHY_SCR_DOWNSHIFT_EN; |
| + val |= FIELD_PREP(MII_M1011_PHY_SCR_DOWNSHIFT_MASK, cnt - 1); |
| |
| - val = MII_M1011_PHY_SCR_DOWNSHIFT_EN; |
| - val |= FIELD_PREP(MII_M1011_PHY_SCR_DOWNSHIFT_MASK, cnt - 1); |
| + err = phy_modify(phydev, MII_M1011_PHY_SCR, |
| + MII_M1011_PHY_SCR_DOWNSHIFT_EN | |
| + MII_M1011_PHY_SCR_DOWNSHIFT_MASK, |
| + val); |
| + } |
| |
| - return phy_modify(phydev, MII_M1011_PHY_SCR, |
| - MII_M1011_PHY_SCR_DOWNSHIFT_EN | |
| - MII_M1011_PHY_SCR_DOWNSHIFT_MASK, |
| - val); |
| + if (err < 0) |
| + return err; |
| + |
| + return genphy_soft_reset(phydev); |
| } |
| |
| static int m88e1011_get_tunable(struct phy_device *phydev, |
| -- |
| 2.30.2 |
| |