Commit 6abaacfb authored by Jose Abreu's avatar Jose Abreu Committed by Stefan Bader

net: stmmac: Fix a race in EEE enable callback

BugLink: https://bugs.launchpad.net/bugs/1818815

[ Upstream commit 8a7493e5 ]

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: default avatarJose Abreu <joabreu@synopsys.com>
Fixes: d765955d ("stmmac: add the Energy Efficient Ethernet support")
Cc: Joao Pinto <jpinto@synopsys.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Cc: Alexandre Torgue <alexandre.torgue@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJuerg Haefliger <juergh@canonical.com>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
parent 536838d5
...@@ -614,25 +614,27 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev, ...@@ -614,25 +614,27 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,
struct ethtool_eee *edata) struct ethtool_eee *edata)
{ {
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
int ret;
priv->eee_enabled = edata->eee_enabled; if (!edata->eee_enabled) {
if (!priv->eee_enabled)
stmmac_disable_eee_mode(priv); stmmac_disable_eee_mode(priv);
else { } else {
/* We are asking for enabling the EEE but it is safe /* We are asking for enabling the EEE but it is safe
* to verify all by invoking the eee_init function. * to verify all by invoking the eee_init function.
* In case of failure it will return an error. * In case of failure it will return an error.
*/ */
priv->eee_enabled = stmmac_eee_init(priv); edata->eee_enabled = stmmac_eee_init(priv);
if (!priv->eee_enabled) if (!edata->eee_enabled)
return -EOPNOTSUPP; return -EOPNOTSUPP;
/* Do not change tx_lpi_timer in case of failure */
priv->tx_lpi_timer = edata->tx_lpi_timer;
} }
return phy_ethtool_set_eee(priv->phydev, edata); ret = phy_ethtool_set_eee(dev->phydev, edata);
if (ret)
return ret;
priv->eee_enabled = edata->eee_enabled;
priv->tx_lpi_timer = edata->tx_lpi_timer;
return 0;
} }
static u32 stmmac_usec2riwt(u32 usec, struct stmmac_priv *priv) static u32 stmmac_usec2riwt(u32 usec, struct stmmac_priv *priv)
......
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