diff --git a/sys/dev/em/if_em.c b/sys/dev/em/if_em.c index 081a24332f6e..3a8f6772cdf5 100644 --- a/sys/dev/em/if_em.c +++ b/sys/dev/em/if_em.c @@ -138,8 +138,11 @@ static int em_probe(device_t); static int em_attach(device_t); static int em_detach(device_t); static int em_shutdown(device_t); +static int em_suspend(device_t); +static int em_resume(device_t); static void em_intr(void *); static void em_start(struct ifnet *); +static void em_start_locked(struct ifnet *ifp); static int em_ioctl(struct ifnet *, u_long, caddr_t); static void em_watchdog(struct ifnet *); static void em_init(void *); @@ -220,6 +223,8 @@ static device_method_t em_methods[] = { DEVMETHOD(device_attach, em_attach), DEVMETHOD(device_detach, em_detach), DEVMETHOD(device_shutdown, em_shutdown), + DEVMETHOD(device_suspend, em_suspend), + DEVMETHOD(device_resume, em_resume), {0, 0} }; @@ -602,6 +607,41 @@ em_shutdown(device_t dev) return(0); } +/* + * Suspend/resume device methods. + */ +static int +em_suspend(device_t dev) +{ + struct adapter *adapter = device_get_softc(dev); + + EM_LOCK(adapter); + em_stop(adapter); + EM_UNLOCK(adapter); + + return bus_generic_suspend(dev); +} + +static int +em_resume(device_t dev) +{ + struct adapter *adapter = device_get_softc(dev); + struct ifnet *ifp; + + EM_LOCK(adapter); + ifp = adapter->ifp; + if (ifp->if_flags & IFF_UP) { + em_init_locked(adapter); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + em_start_locked(ifp); + } + + em_init_locked(adapter); + EM_UNLOCK(adapter); + + return bus_generic_resume(dev); +} + /********************************************************************* * Transmit entry point