This commit introduces the phy_set_pause function to the phylib as a helper to support the set_pauseparam ethtool method.
It is hoped that the new behavior introduced by this function will be widely embraced and the phy_set_sym_pause and phy_set_asym_pause functions can be deprecated. Those functions are retained for all existing users and for any desenting opinions on my interpretation of the functionality. Signed-off-by: Doug Berger <open...@gmail.com> --- drivers/net/phy/phy_device.c | 31 +++++++++++++++++++++++++++++++ include/linux/phy.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 48ab9efa0166..e6dafb3c3e5f 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2614,6 +2614,37 @@ void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) EXPORT_SYMBOL(phy_set_asym_pause); /** + * phy_set_pause - Configure Pause and Asym Pause with autoneg + * @phydev: target phy_device struct + * @rx: Receiver Pause is supported + * @tx: Transmit Pause is supported + * @autoneg: Auto neg should be used + * + * Description: Configure advertised Pause support depending on if + * receiver pause and pause auto neg is supported. Generally called + * from the set_pauseparam ethtool_ops. + * + * Note: Since pause is really a MAC level function it should be + * notified via adjust_link to update its pause functions. + */ +void phy_set_pause(struct phy_device *phydev, bool rx, bool tx, bool autoneg) +{ + linkmode_set_pause(phydev->advertising, tx, rx, autoneg); + + /* Reset the state of an already running link to force a new + * link up event when advertising doesn't change or when PHY + * autoneg is disabled. + */ + mutex_lock(&phydev->lock); + if (phydev->state == PHY_RUNNING) + phydev->state = PHY_UP; + mutex_unlock(&phydev->lock); + + phy_start_aneg(phydev); +} +EXPORT_SYMBOL(phy_set_pause); + +/** * phy_validate_pause - Test if the PHY/MAC support the pause configuration * @phydev: phy_device struct * @pp: requested pause configuration diff --git a/include/linux/phy.h b/include/linux/phy.h index 5d8ff5428010..71e484424e68 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1403,6 +1403,7 @@ void phy_support_asym_pause(struct phy_device *phydev); void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, bool autoneg); void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx); +void phy_set_pause(struct phy_device *phydev, bool rx, bool tx, bool autoneg); bool phy_validate_pause(struct phy_device *phydev, struct ethtool_pauseparam *pp); void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause); -- 2.7.4