net: phy: marvell10g: report if the PHY fails to boot firmware
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 28 May 2019 09:34:42 +0000 (10:34 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 9 Jun 2019 07:18:12 +0000 (09:18 +0200)
[ Upstream commit 3d3ced2ec5d71b99d72ae6910fbdf890bc2eccf0 ]

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/phy/marvell10g.c

index 21b3f36e023a962fdabbeac10402025f4acde82c..4e1279f2460a80bd0c8efa5a8d282ee5069f1754 100644 (file)
@@ -19,6 +19,9 @@
 #include <linux/marvell_phy.h>
 
 enum {
+       MV_PMA_BOOT             = 0xc050,
+       MV_PMA_BOOT_FATAL       = BIT(0),
+
        MV_PCS_BASE_T           = 0x0000,
        MV_PCS_BASE_R           = 0x1000,
        MV_PCS_1000BASEX        = 0x2000,
@@ -59,11 +62,22 @@ static int mv3310_modify(struct phy_device *phydev, int devad, u16 reg,
 static int mv3310_probe(struct phy_device *phydev)
 {
        u32 mmd_mask = MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
+       int ret;
 
        if (!phydev->is_c45 ||
            (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
                return -ENODEV;
 
+       ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT);
+       if (ret < 0)
+               return ret;
+
+       if (ret & MV_PMA_BOOT_FATAL) {
+               dev_warn(&phydev->mdio.dev,
+                        "PHY failed to boot firmware, status=%04x\n", ret);
+               return -ENODEV;
+       }
+
        return 0;
 }