Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5985d563 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-phy-improve-and-simplify-state-machine'



Heiner Kallweit says:

====================
net: phy: improve and simplify state machine

Improve / simplify handling of states PHY_RUNNING and PHY_RESUMING in
phylib state machine.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0813e957 eb4c470a
Loading
Loading
Loading
Loading
+23 −49
Original line number Diff line number Diff line
@@ -941,7 +941,6 @@ void phy_state_machine(struct work_struct *work)
	bool needs_aneg = false, do_suspend = false;
	enum phy_state old_state;
	int err = 0;
	int old_link;

	mutex_lock(&phydev->lock);

@@ -1025,26 +1024,16 @@ void phy_state_machine(struct work_struct *work)
		}
		break;
	case PHY_RUNNING:
		/* Only register a CHANGE if we are polling and link changed
		 * since latest checking.
		 */
		if (phy_polling_mode(phydev)) {
			old_link = phydev->link;
		if (!phy_polling_mode(phydev))
			break;

		err = phy_read_status(phydev);
		if (err)
			break;

			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");
		if (!phydev->link) {
			phydev->state = PHY_NOLINK;
			phy_link_down(phydev, true);
		}
		break;
	case PHY_CHANGELINK:
@@ -1070,29 +1059,15 @@ void phy_state_machine(struct work_struct *work)
	case PHY_RESUMING:
		if (AUTONEG_ENABLE == phydev->autoneg) {
			err = phy_aneg_done(phydev);
			if (err < 0)
				break;

			/* err > 0 if AN is done.
			 * Otherwise, it's 0, and we're  still waiting for AN
			 */
			if (err > 0) {
				err = phy_read_status(phydev);
				if (err)
			if (err < 0) {
				break;

				if (phydev->link) {
					phydev->state = PHY_RUNNING;
					phy_link_up(phydev);
				} else	{
					phydev->state = PHY_NOLINK;
					phy_link_down(phydev, false);
				}
			} else {
			} else if (!err) {
				phydev->state = PHY_AN;
				phydev->link_timeout = PHY_AN_TIMEOUT;
				break;
			}
		} else {
		}

		err = phy_read_status(phydev);
		if (err)
			break;
@@ -1104,7 +1079,6 @@ void phy_state_machine(struct work_struct *work)
			phydev->state = PHY_NOLINK;
			phy_link_down(phydev, false);
		}
		}
		break;
	}