Skip to content

Commit 8a7493e

Browse files
joabreudavem330
authored andcommitted
net: stmmac: Fix a race in EEE enable callback
We are saving the status of EEE even before we try to enable it. This leads to a race with XMIT function that tries to arm EEE timer before we set it up. Fix this by only saving the EEE parameters after all operations are performed with success. Signed-off-by: Jose Abreu <[email protected]> Fixes: d765955 ("stmmac: add the Energy Efficient Ethernet support") Cc: Joao Pinto <[email protected]> Cc: David S. Miller <[email protected]> Cc: Giuseppe Cavallaro <[email protected]> Cc: Alexandre Torgue <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 694d790 commit 8a7493e

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -696,25 +696,27 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,
696696
struct ethtool_eee *edata)
697697
{
698698
struct stmmac_priv *priv = netdev_priv(dev);
699+
int ret;
699700

700-
priv->eee_enabled = edata->eee_enabled;
701-
702-
if (!priv->eee_enabled)
701+
if (!edata->eee_enabled) {
703702
stmmac_disable_eee_mode(priv);
704-
else {
703+
} else {
705704
/* We are asking for enabling the EEE but it is safe
706705
* to verify all by invoking the eee_init function.
707706
* In case of failure it will return an error.
708707
*/
709-
priv->eee_enabled = stmmac_eee_init(priv);
710-
if (!priv->eee_enabled)
708+
edata->eee_enabled = stmmac_eee_init(priv);
709+
if (!edata->eee_enabled)
711710
return -EOPNOTSUPP;
712-
713-
/* Do not change tx_lpi_timer in case of failure */
714-
priv->tx_lpi_timer = edata->tx_lpi_timer;
715711
}
716712

717-
return phy_ethtool_set_eee(dev->phydev, edata);
713+
ret = phy_ethtool_set_eee(dev->phydev, edata);
714+
if (ret)
715+
return ret;
716+
717+
priv->eee_enabled = edata->eee_enabled;
718+
priv->tx_lpi_timer = edata->tx_lpi_timer;
719+
return 0;
718720
}
719721

720722
static u32 stmmac_usec2riwt(u32 usec, struct stmmac_priv *priv)

0 commit comments

Comments
 (0)