diff options
author | jhb <jhb@FreeBSD.org> | 2006-11-20 23:30:07 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-11-20 23:30:07 +0000 |
commit | 28fc198f34d356823830c57598526252eb6b2e1a (patch) | |
tree | ae2cffb6baca5b69c4b1ff10374489960422d347 /sys/dev/bfe | |
parent | aacfa06ebd79eedf2365644493b35dd4de6fac71 (diff) | |
download | FreeBSD-src-28fc198f34d356823830c57598526252eb6b2e1a.zip FreeBSD-src-28fc198f34d356823830c57598526252eb6b2e1a.tar.gz |
Add suspend/resume support. Unlike many other NIC drivers,
bfe_init_locked() wasn't sufficient to bring the chip back to life, it also
required a call to bfe_chip_reset() during resume.
Tested by: Stepan Zastupov +redchrom at gmail+
MFC after: 1 week
Diffstat (limited to 'sys/dev/bfe')
-rw-r--r-- | sys/dev/bfe/if_bfe.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/sys/dev/bfe/if_bfe.c b/sys/dev/bfe/if_bfe.c index 3aa99ee..dc24da9 100644 --- a/sys/dev/bfe/if_bfe.c +++ b/sys/dev/bfe/if_bfe.c @@ -87,6 +87,8 @@ static struct bfe_type bfe_devs[] = { static int bfe_probe (device_t); static int bfe_attach (device_t); static int bfe_detach (device_t); +static int bfe_suspend (device_t); +static int bfe_resume (device_t); static void bfe_release_resources (struct bfe_softc *); static void bfe_intr (void *); static void bfe_start (struct ifnet *); @@ -136,6 +138,8 @@ static device_method_t bfe_methods[] = { DEVMETHOD(device_attach, bfe_attach), DEVMETHOD(device_detach, bfe_detach), DEVMETHOD(device_shutdown, bfe_shutdown), + DEVMETHOD(device_suspend, bfe_suspend), + DEVMETHOD(device_resume, bfe_resume), /* bus interface */ DEVMETHOD(bus_print_child, bus_generic_print_child), @@ -480,6 +484,40 @@ bfe_shutdown(device_t dev) } static int +bfe_suspend(device_t dev) +{ + struct bfe_softc *sc; + + sc = device_get_softc(dev); + BFE_LOCK(sc); + bfe_stop(sc); + BFE_UNLOCK(sc); + + return (0); +} + +static int +bfe_resume(device_t dev) +{ + struct bfe_softc *sc; + struct ifnet *ifp; + + sc = device_get_softc(dev); + ifp = sc->bfe_ifp; + BFE_LOCK(sc); + bfe_chip_reset(sc); + if (ifp->if_flags & IFF_UP) { + bfe_init_locked(sc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING && + !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + bfe_start_locked(ifp); + } + BFE_UNLOCK(sc); + + return (0); +} + +static int bfe_miibus_readreg(device_t dev, int phy, int reg) { struct bfe_softc *sc; |