Skip to content

Commit

Permalink
net: phy: move phy_state_machine()
Browse files Browse the repository at this point in the history
Move phy_state_machine() before phy_stop() to avoid subsequent patches
introducing forward references.

Tested-by: Jijie Shao <shaojijie@huawei.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Russell King (Oracle) authored and David S. Miller committed Sep 17, 2023
1 parent 6e19b35 commit c398ef4
Showing 1 changed file with 76 additions and 76 deletions.
152 changes: 76 additions & 76 deletions drivers/net/phy/phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -1353,82 +1353,6 @@ void phy_free_interrupt(struct phy_device *phydev)
}
EXPORT_SYMBOL(phy_free_interrupt);

/**
* phy_stop - Bring down the PHY link, and stop checking the status
* @phydev: target phy_device struct
*/
void phy_stop(struct phy_device *phydev)
{
struct net_device *dev = phydev->attached_dev;
enum phy_state old_state;

if (!phy_is_started(phydev) && phydev->state != PHY_DOWN &&
phydev->state != PHY_ERROR) {
WARN(1, "called from state %s\n",
phy_state_to_str(phydev->state));
return;
}

mutex_lock(&phydev->lock);
old_state = phydev->state;

if (phydev->state == PHY_CABLETEST) {
phy_abort_cable_test(phydev);
netif_testing_off(dev);
}

if (phydev->sfp_bus)
sfp_upstream_stop(phydev->sfp_bus);

phydev->state = PHY_HALTED;
phy_process_state_change(phydev, old_state);

mutex_unlock(&phydev->lock);

phy_state_machine(&phydev->state_queue.work);
phy_stop_machine(phydev);

/* Cannot call flush_scheduled_work() here as desired because
* of rtnl_lock(), but PHY_HALTED shall guarantee irq handler
* will not reenable interrupts.
*/
}
EXPORT_SYMBOL(phy_stop);

/**
* phy_start - start or restart a PHY device
* @phydev: target phy_device struct
*
* Description: Indicates the attached device's readiness to
* handle PHY-related work. Used during startup to start the
* PHY, and after a call to phy_stop() to resume operation.
* Also used to indicate the MDIO bus has cleared an error
* condition.
*/
void phy_start(struct phy_device *phydev)
{
mutex_lock(&phydev->lock);

if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) {
WARN(1, "called from state %s\n",
phy_state_to_str(phydev->state));
goto out;
}

if (phydev->sfp_bus)
sfp_upstream_start(phydev->sfp_bus);

/* if phy was suspended, bring the physical link up again */
__phy_resume(phydev);

phydev->state = PHY_UP;

phy_start_machine(phydev);
out:
mutex_unlock(&phydev->lock);
}
EXPORT_SYMBOL(phy_start);

/**
* phy_state_machine - Handle the state machine
* @work: work_struct that describes the work to be done
Expand Down Expand Up @@ -1520,6 +1444,82 @@ void phy_state_machine(struct work_struct *work)
phy_suspend(phydev);
}

/**
* phy_stop - Bring down the PHY link, and stop checking the status
* @phydev: target phy_device struct
*/
void phy_stop(struct phy_device *phydev)
{
struct net_device *dev = phydev->attached_dev;
enum phy_state old_state;

if (!phy_is_started(phydev) && phydev->state != PHY_DOWN &&
phydev->state != PHY_ERROR) {
WARN(1, "called from state %s\n",
phy_state_to_str(phydev->state));
return;
}

mutex_lock(&phydev->lock);
old_state = phydev->state;

if (phydev->state == PHY_CABLETEST) {
phy_abort_cable_test(phydev);
netif_testing_off(dev);
}

if (phydev->sfp_bus)
sfp_upstream_stop(phydev->sfp_bus);

phydev->state = PHY_HALTED;
phy_process_state_change(phydev, old_state);

mutex_unlock(&phydev->lock);

phy_state_machine(&phydev->state_queue.work);
phy_stop_machine(phydev);

/* Cannot call flush_scheduled_work() here as desired because
* of rtnl_lock(), but PHY_HALTED shall guarantee irq handler
* will not reenable interrupts.
*/
}
EXPORT_SYMBOL(phy_stop);

/**
* phy_start - start or restart a PHY device
* @phydev: target phy_device struct
*
* Description: Indicates the attached device's readiness to
* handle PHY-related work. Used during startup to start the
* PHY, and after a call to phy_stop() to resume operation.
* Also used to indicate the MDIO bus has cleared an error
* condition.
*/
void phy_start(struct phy_device *phydev)
{
mutex_lock(&phydev->lock);

if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) {
WARN(1, "called from state %s\n",
phy_state_to_str(phydev->state));
goto out;
}

if (phydev->sfp_bus)
sfp_upstream_start(phydev->sfp_bus);

/* if phy was suspended, bring the physical link up again */
__phy_resume(phydev);

phydev->state = PHY_UP;

phy_start_machine(phydev);
out:
mutex_unlock(&phydev->lock);
}
EXPORT_SYMBOL(phy_start);

/**
* phy_mac_interrupt - MAC says the link has changed
* @phydev: phy_device struct with changed link
Expand Down

0 comments on commit c398ef4

Please sign in to comment.