diff options
-rw-r--r-- | sys/dev/ic/rt2661.c | 62 | ||||
-rw-r--r-- | sys/dev/ic/rt2661var.h | 5 |
2 files changed, 64 insertions, 3 deletions
diff --git a/sys/dev/ic/rt2661.c b/sys/dev/ic/rt2661.c index c09d6f74505..aa78bad3cdb 100644 --- a/sys/dev/ic/rt2661.c +++ b/sys/dev/ic/rt2661.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2661.c,v 1.17 2006/05/01 08:41:11 damien Exp $ */ +/* $OpenBSD: rt2661.c,v 1.18 2006/06/01 16:24:22 robert Exp $ */ /*- * Copyright (c) 2006 @@ -69,7 +69,7 @@ #ifdef RAL_DEBUG #define DPRINTF(x) do { if (rt2661_debug > 0) printf x; } while (0) #define DPRINTFN(n, x) do { if (rt2661_debug >= (n)) printf x; } while (0) -int rt2661_debug = 0; +int rt2661_debug = 1; #else #define DPRINTF(x) #define DPRINTFN(n, x) @@ -144,6 +144,7 @@ void rt2661_read_eeprom(struct rt2661_softc *); int rt2661_bbp_init(struct rt2661_softc *); int rt2661_init(struct ifnet *); void rt2661_stop(struct ifnet *, int); +void rt2661_power(int, void *); int rt2661_load_microcode(struct rt2661_softc *, const uint8_t *, int); #ifdef notyet @@ -490,6 +491,18 @@ rt2661_attach(void *xsc, int id) sc->sc_txtap.wt_ihdr.it_present = htole32(RT2661_TX_RADIOTAP_PRESENT); #endif + /* + * Make sure the interface is shutdown during reboot. + */ + sc->sc_sdhook = shutdownhook_establish(rt2661_shutdown, sc); + if (sc->sc_sdhook == NULL) + printf("%s: WARNING: unable to establish shutdown hook\n", + sc->sc_dev.dv_xname); + sc->sc_powerhook = powerhook_establish(rt2661_power, sc); + if (sc->sc_powerhook == NULL) + printf("%s: WARNING: unable to establish power hook\n", + sc->sc_dev.dv_xname); + return 0; fail6: rt2661_free_tx_ring(sc, &sc->mgtq); @@ -512,6 +525,11 @@ rt2661_detach(void *xsc) ieee80211_ifdetach(ifp); /* free all nodes */ if_detach(ifp); + if (sc->sc_powerhook != NULL) + powerhook_disestablish(sc->sc_powerhook); + if (sc->sc_sdhook != NULL) + shutdownhook_disestablish(sc->sc_sdhook); + rt2661_free_tx_ring(sc, &sc->txq[0]); rt2661_free_tx_ring(sc, &sc->txq[1]); rt2661_free_tx_ring(sc, &sc->txq[2]); @@ -3012,3 +3030,43 @@ rt2661_get_rssi(struct rt2661_softc *sc, uint8_t raw) } return rssi; } + +void +rt2661_power(int why, void *arg) +{ + struct rt2661_softc *sc = arg; + struct ifnet *ifp = &sc->sc_ic.ic_if; + int s; + + DPRINTF(("%s: rt2661_power(%d)\n", sc->sc_dev.dv_xname, why)); + + s = splnet(); + switch (why) { + case PWR_SUSPEND: + case PWR_STANDBY: + rt2661_stop(ifp, 1); + sc->sc_flags &= ~RT2661_FWLOADED; + if (sc->sc_power != NULL) + (*sc->sc_power)(sc, why); + break; + case PWR_RESUME: + if (ifp->if_flags & IFF_UP) { + rt2661_init(ifp); + if (sc->sc_power != NULL) + (*sc->sc_power)(sc, why); + if (ifp->if_flags & IFF_RUNNING) + rt2661_start(ifp); + } + break; + } + splx(s); +} + +void +rt2661_shutdown(void *arg) +{ + struct rt2661_softc *sc = arg; + struct ifnet *ifp = &sc->sc_ic.ic_if; + + rt2661_stop(ifp, 1); +} diff --git a/sys/dev/ic/rt2661var.h b/sys/dev/ic/rt2661var.h index a41bb2d082f..bbfd1071253 100644 --- a/sys/dev/ic/rt2661var.h +++ b/sys/dev/ic/rt2661var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2661var.h,v 1.4 2006/02/25 12:56:47 damien Exp $ */ +/* $OpenBSD: rt2661var.h,v 1.5 2006/06/01 16:24:22 robert Exp $ */ /*- * Copyright (c) 2006 @@ -165,8 +165,11 @@ struct rt2661_softc { #define sc_txtap sc_txtapu.th int sc_txtap_len; #endif + void *sc_sdhook; /* shutdown hook */ + void *sc_powerhook; /* power management hook */ }; int rt2661_attach(void *, int); int rt2661_detach(void *); int rt2661_intr(void *); +void rt2661_shutdown(void *); |