summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2019-05-28 05:34:42 -0400
committerDavid S. Miller <davem@davemloft.net>2019-05-29 17:25:10 -0400
commit3d3ced2ec5d71b99d72ae6910fbdf890bc2eccf0 (patch)
tree348ca5ef388d13e50b86ce12773cb50ed2c14fec
parentc678726305b9425454be7c8a7624290b602602fc (diff)
net: phy: marvell10g: report if the PHY fails to boot firmware
Some boards do not have the PHY firmware programmed in the 3310's flash, which leads to the PHY not working as expected. Warn the user when the PHY fails to boot the firmware and refuse to initialise. Fixes: 20b2af32ff3f ("net: phy: add Marvell Alaska X 88X3310 10Gigabit PHY support") Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Tested-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/marvell10g.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c
index 238a20e13d6a..3b99882692e3 100644
--- a/drivers/net/phy/marvell10g.c
+++ b/drivers/net/phy/marvell10g.c
@@ -31,6 +31,9 @@
31#define MV_PHY_ALASKA_NBT_QUIRK_REV (MARVELL_PHY_ID_88X3310 | 0xa) 31#define MV_PHY_ALASKA_NBT_QUIRK_REV (MARVELL_PHY_ID_88X3310 | 0xa)
32 32
33enum { 33enum {
34 MV_PMA_BOOT = 0xc050,
35 MV_PMA_BOOT_FATAL = BIT(0),
36
34 MV_PCS_BASE_T = 0x0000, 37 MV_PCS_BASE_T = 0x0000,
35 MV_PCS_BASE_R = 0x1000, 38 MV_PCS_BASE_R = 0x1000,
36 MV_PCS_1000BASEX = 0x2000, 39 MV_PCS_1000BASEX = 0x2000,
@@ -213,6 +216,16 @@ static int mv3310_probe(struct phy_device *phydev)
213 (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask) 216 (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
214 return -ENODEV; 217 return -ENODEV;
215 218
219 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT);
220 if (ret < 0)
221 return ret;
222
223 if (ret & MV_PMA_BOOT_FATAL) {
224 dev_warn(&phydev->mdio.dev,
225 "PHY failed to boot firmware, status=%04x\n", ret);
226 return -ENODEV;
227 }
228
216 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); 229 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
217 if (!priv) 230 if (!priv)
218 return -ENOMEM; 231 return -ENOMEM;