| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| Date: Mon, 5 Jun 2017 12:22:55 +0100 |
| Subject: net: phy: avoid genphy_aneg_done() for PHYs without clause 22 support |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| |
| [ Upstream commit 41408ad519f7a2a1c5229e61f2a97f4df1b61adc ] |
| |
| Avoid calling genphy_aneg_done() for PHYs that do not implement the |
| Clause 22 register set. |
| |
| Clause 45 PHYs may implement the Clause 22 register set along with the |
| Clause 22 extension MMD. Hence, we can't simply block access to the |
| Clause 22 functions based on the PHY being a Clause 45 PHY. |
| |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Reviewed-by: Andrew Lunn <andrew@lunn.ch> |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/phy/phy.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/net/phy/phy.c |
| +++ b/drivers/net/phy/phy.c |
| @@ -148,6 +148,12 @@ static inline int phy_aneg_done(struct p |
| if (phydev->drv->aneg_done) |
| return phydev->drv->aneg_done(phydev); |
| |
| + /* Avoid genphy_aneg_done() if the Clause 45 PHY does not |
| + * implement Clause 22 registers |
| + */ |
| + if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) |
| + return -EINVAL; |
| + |
| return genphy_aneg_done(phydev); |
| } |
| |