Commit 0c122405 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

net: ethernet: Add helper for set_pauseparam for Pause

ethtool can be used to enable/disable pause. Add a helper to configure
the PHY when Pause is supported.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 70814e81
...@@ -892,11 +892,8 @@ static int bcm_enet_open(struct net_device *dev) ...@@ -892,11 +892,8 @@ static int bcm_enet_open(struct net_device *dev)
/* mask with MAC supported features */ /* mask with MAC supported features */
phy_support_sym_pause(phydev); phy_support_sym_pause(phydev);
phy_set_max_speed(phydev, SPEED_100); phy_set_max_speed(phydev, SPEED_100);
phy_set_sym_pause(phydev, priv->pause_rx, priv->pause_rx,
if (priv->pause_auto && priv->pause_rx && priv->pause_tx) priv->pause_auto);
phydev->advertising |= SUPPORTED_Pause;
else
phydev->advertising &= ~SUPPORTED_Pause;
phy_attached_info(phydev); phy_attached_info(phydev);
......
...@@ -2229,13 +2229,8 @@ static int fec_enet_set_pauseparam(struct net_device *ndev, ...@@ -2229,13 +2229,8 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
fep->pause_flag |= pause->rx_pause ? FEC_PAUSE_FLAG_ENABLE : 0; fep->pause_flag |= pause->rx_pause ? FEC_PAUSE_FLAG_ENABLE : 0;
fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0; fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0;
if (pause->rx_pause || pause->autoneg) { phy_set_sym_pause(ndev->phydev, pause->rx_pause, pause->tx_pause,
ndev->phydev->supported |= ADVERTISED_Pause; pause->autoneg);
ndev->phydev->advertising |= ADVERTISED_Pause;
} else {
ndev->phydev->supported &= ~ADVERTISED_Pause;
ndev->phydev->advertising &= ~ADVERTISED_Pause;
}
if (pause->autoneg) { if (pause->autoneg) {
if (netif_running(ndev)) if (netif_running(ndev))
......
...@@ -1810,6 +1810,29 @@ void phy_support_asym_pause(struct phy_device *phydev) ...@@ -1810,6 +1810,29 @@ void phy_support_asym_pause(struct phy_device *phydev)
} }
EXPORT_SYMBOL(phy_support_asym_pause); EXPORT_SYMBOL(phy_support_asym_pause);
/**
* phy_set_sym_pause - Configure symmetric Pause
* @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 .ndo.
*/
void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx,
bool autoneg)
{
phydev->supported &= ~SUPPORTED_Pause;
if (rx && tx && autoneg)
phydev->supported |= SUPPORTED_Pause;
phydev->advertising = phydev->supported;
}
EXPORT_SYMBOL(phy_set_sym_pause);
/** /**
* phy_set_asym_pause - Configure Pause and Asym Pause * phy_set_asym_pause - Configure Pause and Asym Pause
* @phydev: target phy_device struct * @phydev: target phy_device struct
......
...@@ -1052,6 +1052,8 @@ int phy_set_max_speed(struct phy_device *phydev, u32 max_speed); ...@@ -1052,6 +1052,8 @@ int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode); void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode);
void phy_support_sym_pause(struct phy_device *phydev); void phy_support_sym_pause(struct phy_device *phydev);
void phy_support_asym_pause(struct phy_device *phydev); 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_asym_pause(struct phy_device *phydev, bool rx, bool tx);
int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment