> >>From your description, it sounds like you can call phy_resume() on a > > device which is not suspended. > Do you mean after calling dev_close, the device is still not suspended?
You only call dev_close() if the device is running. What if somebody runs the self test on an interface when it has never been opened? It looks like you will call phy_resume(). But since it has never been suspended, you could be in trouble. > > In general, suspend is expected to > > store away state which will be lost when powering down a > > device. Resume writes that state back into the device after it is > > powered up. So resuming a device which was never suspended could write > > bad state into it. > > Do you mean phydev->suspended has bad state? phy_resume() current does not check the phydev->suspended state. > > Also, what about if WOL has been set before closing the device? > > phy_suspend will return errro. > > int phy_suspend(struct phy_device *phydev) > { > struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); > struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; > int ret = 0; > > /* If the device has WOL enabled, we cannot suspend the PHY */ > phy_ethtool_get_wol(phydev, &wol); > if (wol.wolopts) > return -EBUSY; > > if (phydev->drv && phydrv->suspend) > ret = phydrv->suspend(phydev); > > if (ret) > return ret; > > phydev->suspended = true; > > return ret; > } Which means when you call phy_resume() in lb_setup() you are again resuming a device which is not suspended... Andrew