summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2019-06-05 11:44:55 +0100
committerRussell King <rmk+kernel@armlinux.org.uk>2019-07-09 11:44:26 +0100
commit80f2ac44dc4d0bca00146f6ff14570012a38653d (patch)
tree322367610a26f5f57da02f5176e657cf302c943f
parent290696a412e9ae4decb0bd123e3a2ff6241d9845 (diff)
net: phy: marvell10g: allow PHY to probe without firmware
Allow the PHY to probe when there is no firmware, but do not allow the link to come up by forcing the PHY state to PHY_HALTED in a similar way to phy_error(). Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--drivers/net/phy/marvell10g.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c
index 3b99882692e3..4e2f59c414d6 100644
--- a/drivers/net/phy/marvell10g.c
+++ b/drivers/net/phy/marvell10g.c
@@ -62,6 +62,8 @@ enum {
};
struct mv3310_priv {
+ bool firmware_failed;
+
struct device *hwmon_dev;
char *hwmon_name;
};
@@ -216,6 +218,10 @@ static int mv3310_probe(struct phy_device *phydev)
(phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
return -ENODEV;
+ priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT);
if (ret < 0)
return ret;
@@ -223,13 +229,9 @@ static int mv3310_probe(struct phy_device *phydev)
if (ret & MV_PMA_BOOT_FATAL) {
dev_warn(&phydev->mdio.dev,
"PHY failed to boot firmware, status=%04x\n", ret);
- return -ENODEV;
+ priv->firmware_failed = true;
}
- priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
dev_set_drvdata(&phydev->mdio.dev, priv);
ret = mv3310_hwmon_probe(phydev);
@@ -257,6 +259,19 @@ static int mv3310_resume(struct phy_device *phydev)
return mv3310_hwmon_config(phydev, true);
}
+static void mv3310_link_change_notify(struct phy_device *phydev)
+{
+ struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
+ enum phy_state state = phydev->state;
+
+ if (priv->firmware_failed &&
+ (state == PHY_UP || state == PHY_RESUMING)) {
+ dev_warn(&phydev->mdio.dev,
+ "PHY firmware failure: link forced down");
+ phydev->state = PHY_HALTED;
+ }
+}
+
/* Some PHYs in the Alaska family such as the 88X3310 and the 88E2010
* don't set bit 14 in PMA Extended Abilities (1.11), although they do
* support 2.5GBASET and 5GBASET. For these models, we can still read their