Skip to content

Commit

Permalink
phy: phy_start_aneg: Add an unlocked version
Browse files Browse the repository at this point in the history
Split phy_start_aneg into a wrapper which takes the PHY lock, and a
helper doing the real work. This will be needed when
phy_ethtook_ksettings_set takes the lock.

Fixes: 2d55173 ("phy: add generic function to support ksetting support")
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
lunn authored and davem330 committed Oct 25, 2021
1 parent 64cd92d commit 707293a
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions drivers/net/phy/phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -700,33 +700,51 @@ static int phy_check_link_status(struct phy_device *phydev)
}

/**
* phy_start_aneg - start auto-negotiation for this PHY device
* _phy_start_aneg - start auto-negotiation for this PHY device
* @phydev: the phy_device struct
*
* Description: Sanitizes the settings (if we're not autonegotiating
* them), and then calls the driver's config_aneg function.
* If the PHYCONTROL Layer is operating, we change the state to
* reflect the beginning of Auto-negotiation or forcing.
*/
int phy_start_aneg(struct phy_device *phydev)
static int _phy_start_aneg(struct phy_device *phydev)
{
int err;

lockdep_assert_held(&phydev->lock);

if (!phydev->drv)
return -EIO;

mutex_lock(&phydev->lock);

if (AUTONEG_DISABLE == phydev->autoneg)
phy_sanitize_settings(phydev);

err = phy_config_aneg(phydev);
if (err < 0)
goto out_unlock;
return err;

if (phy_is_started(phydev))
err = phy_check_link_status(phydev);
out_unlock:

return err;
}

/**
* phy_start_aneg - start auto-negotiation for this PHY device
* @phydev: the phy_device struct
*
* Description: Sanitizes the settings (if we're not autonegotiating
* them), and then calls the driver's config_aneg function.
* If the PHYCONTROL Layer is operating, we change the state to
* reflect the beginning of Auto-negotiation or forcing.
*/
int phy_start_aneg(struct phy_device *phydev)
{
int err;

mutex_lock(&phydev->lock);
err = _phy_start_aneg(phydev);
mutex_unlock(&phydev->lock);

return err;
Expand Down

0 comments on commit 707293a

Please sign in to comment.