|
@@ -1065,6 +1065,15 @@ void phy_state_machine(struct work_struct *work)
|
|
|
if (old_link != phydev->link)
|
|
|
phydev->state = PHY_CHANGELINK;
|
|
|
}
|
|
|
+ /*
|
|
|
+ * Failsafe: check that nobody set phydev->link=0 between two
|
|
|
+ * poll cycles, otherwise we won't leave RUNNING state as long
|
|
|
+ * as link remains down.
|
|
|
+ */
|
|
|
+ if (!phydev->link && phydev->state == PHY_RUNNING) {
|
|
|
+ phydev->state = PHY_CHANGELINK;
|
|
|
+ phydev_err(phydev, "no link in PHY_RUNNING\n");
|
|
|
+ }
|
|
|
break;
|
|
|
case PHY_CHANGELINK:
|
|
|
err = phy_read_status(phydev);
|