| From 4c87e1e683d5f7f5cdddd77549aa7c98f582a7eb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 5 Nov 2019 11:07:26 -0800 |
| Subject: net: bcmgenet: reapply manual settings to the PHY |
| |
| From: Doug Berger <opendmb@gmail.com> |
| |
| [ Upstream commit 0686bd9d5e6863f60e4bb1e78e6fe7bb217a0890 ] |
| |
| The phy_init_hw() function may reset the PHY to a configuration |
| that does not match manual network settings stored in the phydev |
| structure. If the phy state machine is polled rather than event |
| driven this can create a timing hazard where the phy state machine |
| might alter the settings stored in the phydev structure from the |
| value read from the BMCR. |
| |
| This commit follows invocations of phy_init_hw() by the bcmgenet |
| driver with invocations of the genphy_config_aneg() function to |
| ensure that the BMCR is written to match the settings held in the |
| phydev structure. This prevents the risk of manual settings being |
| accidentally altered. |
| |
| Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file") |
| Signed-off-by: Doug Berger <opendmb@gmail.com> |
| Acked-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/broadcom/genet/bcmgenet.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| index 6f7278d2ce4f2..b7d75011cede5 100644 |
| --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| @@ -2619,8 +2619,10 @@ static void bcmgenet_irq_task(struct work_struct *work) |
| spin_unlock_irq(&priv->lock); |
| |
| if (status & UMAC_IRQ_PHY_DET_R && |
| - priv->dev->phydev->autoneg != AUTONEG_ENABLE) |
| + priv->dev->phydev->autoneg != AUTONEG_ENABLE) { |
| phy_init_hw(priv->dev->phydev); |
| + genphy_config_aneg(priv->dev->phydev); |
| + } |
| |
| /* Link UP/DOWN event */ |
| if (status & UMAC_IRQ_LINK_EVENT) |
| @@ -3673,6 +3675,7 @@ static int bcmgenet_resume(struct device *d) |
| phy_init_hw(dev->phydev); |
| |
| /* Speed settings must be restored */ |
| + genphy_config_aneg(dev->phydev); |
| bcmgenet_mii_config(priv->dev, false); |
| |
| bcmgenet_set_hw_addr(priv, dev->dev_addr); |
| -- |
| 2.20.1 |
| |