net: ethernet: Add helper for set_pauseparam for Asym Pause
ethtool can be used to enable/disable pause. Add a helper to configure the PHY when asym pause is supported. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
c306ad3618
commit
70814e819c
@@ -12492,7 +12492,6 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||
tg3_warn_mgmt_link_flap(tp);
|
||||
|
||||
if (tg3_flag(tp, USE_PHYLIB)) {
|
||||
u32 newadv;
|
||||
struct phy_device *phydev;
|
||||
|
||||
phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
|
||||
@@ -12503,20 +12502,16 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||
return -EINVAL;
|
||||
|
||||
tp->link_config.flowctrl = 0;
|
||||
phy_set_asym_pause(phydev, epause->rx_pause, epause->tx_pause);
|
||||
if (epause->rx_pause) {
|
||||
tp->link_config.flowctrl |= FLOW_CTRL_RX;
|
||||
|
||||
if (epause->tx_pause) {
|
||||
tp->link_config.flowctrl |= FLOW_CTRL_TX;
|
||||
newadv = ADVERTISED_Pause;
|
||||
} else
|
||||
newadv = ADVERTISED_Pause |
|
||||
ADVERTISED_Asym_Pause;
|
||||
}
|
||||
} else if (epause->tx_pause) {
|
||||
tp->link_config.flowctrl |= FLOW_CTRL_TX;
|
||||
newadv = ADVERTISED_Asym_Pause;
|
||||
} else
|
||||
newadv = 0;
|
||||
}
|
||||
|
||||
if (epause->autoneg)
|
||||
tg3_flag_set(tp, PAUSE_AUTONEG);
|
||||
@@ -12524,33 +12519,19 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||
tg3_flag_clear(tp, PAUSE_AUTONEG);
|
||||
|
||||
if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) {
|
||||
u32 oldadv = phydev->advertising &
|
||||
(ADVERTISED_Pause | ADVERTISED_Asym_Pause);
|
||||
if (oldadv != newadv) {
|
||||
phydev->advertising &=
|
||||
~(ADVERTISED_Pause |
|
||||
ADVERTISED_Asym_Pause);
|
||||
phydev->advertising |= newadv;
|
||||
if (phydev->autoneg) {
|
||||
/*
|
||||
* Always renegotiate the link to
|
||||
* inform our link partner of our
|
||||
* flow control settings, even if the
|
||||
* flow control is forced. Let
|
||||
* tg3_adjust_link() do the final
|
||||
* flow control setup.
|
||||
*/
|
||||
return phy_start_aneg(phydev);
|
||||
}
|
||||
if (phydev->autoneg) {
|
||||
/* phy_set_asym_pause() will
|
||||
* renegotiate the link to inform our
|
||||
* link partner of our flow control
|
||||
* settings, even if the flow control
|
||||
* is forced. Let tg3_adjust_link()
|
||||
* do the final flow control setup.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!epause->autoneg)
|
||||
tg3_setup_flow_control(tp, 0, 0);
|
||||
} else {
|
||||
tp->link_config.advertising &=
|
||||
~(ADVERTISED_Pause |
|
||||
ADVERTISED_Asym_Pause);
|
||||
tp->link_config.advertising |= newadv;
|
||||
}
|
||||
} else {
|
||||
int irq_sync = 0;
|
||||
|
Reference in New Issue
Block a user