On Sun, Jan 05, 2020 at 11:08:32PM +0100, Andrew Lunn wrote: > > @@ -1435,8 +1436,10 @@ static int ethtool_begin(struct net_device *dev) > > struct epic_private *ep = netdev_priv(dev); > > void __iomem *ioaddr = ep->ioaddr; > > > > + if (ep->ethtool_ops_nesting == U32_MAX) > > + return -EBUSY; > > /* power-up, if interface is down */ > > - if (!netif_running(dev)) { > > + if (ep->ethtool_ops_nesting++ && !netif_running(dev)) { > > ew32(GENCTL, 0x0200); > > ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800); > > } > > Hi Michal > > In the via-velocity you added: > > + if (vptr->ethtool_ops_nesting == U32_MAX) > + return -EBUSY; > + if (!vptr->ethtool_ops_nesting++ && !netif_running(dev)) > velocity_set_power_state(vptr, PCI_D0); > return 0; > > These two fragments differ by a ! . Is that correct? You are right, thank you for catching it. This should be if (!ep->ethtool_ops_nesting++ && !netif_running(dev)) { as well, we only want to wake the device up in the first (outermost) ->begin(). (It would probably do no harm to do it each time but not doing it in the first would be wrong.) I'll send v2 in a moment. Michal