summaryrefslogtreecommitdiffstats
path: root/sys/dev/bfe
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-11-20 23:30:07 +0000
committerjhb <jhb@FreeBSD.org>2006-11-20 23:30:07 +0000
commit28fc198f34d356823830c57598526252eb6b2e1a (patch)
treeae2cffb6baca5b69c4b1ff10374489960422d347 /sys/dev/bfe
parentaacfa06ebd79eedf2365644493b35dd4de6fac71 (diff)
downloadFreeBSD-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.c38
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;
OpenPOWER on IntegriCloud