diff options
author | Marcus Glocker <mglocker@cvs.openbsd.org> | 2008-01-21 19:37:37 +0000 |
---|---|---|
committer | Marcus Glocker <mglocker@cvs.openbsd.org> | 2008-01-21 19:37:37 +0000 |
commit | 7d3cf5f78e38308b6c5f95dd944b94c03a55f29e (patch) | |
tree | a6db9608f601fdef83f89f3bfab8ebb0bc0f0b86 /sys/dev/usb/if_upgt.c | |
parent | 0af8b844099628a21ffc6740a3dc7c76e1b3cb9f (diff) |
Add shutdown hook which resets the device when called. This solves
re-attach issues when rebooting with upgt attached.
Diffstat (limited to 'sys/dev/usb/if_upgt.c')
-rw-r--r-- | sys/dev/usb/if_upgt.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/sys/dev/usb/if_upgt.c b/sys/dev/usb/if_upgt.c index 010b1315cee..e4b00b9d55e 100644 --- a/sys/dev/usb/if_upgt.c +++ b/sys/dev/usb/if_upgt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_upgt.c,v 1.25 2008/01/20 23:34:12 mglocker Exp $ */ +/* $OpenBSD: if_upgt.c,v 1.26 2008/01/21 19:37:36 mglocker Exp $ */ /* * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org> @@ -81,7 +81,8 @@ int upgt_debug = 2; */ int upgt_match(struct device *, void *, void *); void upgt_attach(struct device *, struct device *, void *); -void upgt_attachhook(void *); +void upgt_attach_hook(void *); +void upgt_shutdown_hook(void *); int upgt_detach(struct device *, int); int upgt_activate(struct device *, enum devact); @@ -280,9 +281,9 @@ upgt_attach(struct device *parent, struct device *self, void *aux) * We need the firmware loaded to complete the attach. */ if (rootvp == NULL) - mountroothook_establish(upgt_attachhook, sc); + mountroothook_establish(upgt_attach_hook, sc); else - upgt_attachhook(sc); + upgt_attach_hook(sc); return; fail: @@ -290,7 +291,7 @@ fail: } void -upgt_attachhook(void *arg) +upgt_attach_hook(void *arg) { struct upgt_softc *sc = arg; struct ieee80211com *ic = &sc->sc_ic; @@ -423,6 +424,9 @@ upgt_attachhook(void *arg) printf("%s: address %s\n", sc->sc_dev.dv_xname, ether_sprintf(ic->ic_myaddr)); + /* setup shutdown hook */ + sc->sc_sdhook = shutdownhook_establish(upgt_shutdown_hook, sc); + /* device attached */ sc->sc_flags |= UPGT_DEVICE_ATTACHED; @@ -431,6 +435,18 @@ fail: printf("%s: %s failed!\n", sc->sc_dev.dv_xname, __func__); } +void +upgt_shutdown_hook(void *arg) +{ + struct upgt_softc *sc = (struct upgt_softc *)arg; + + DPRINTF(1, "%s: %s\n", sc->sc_dev.dv_xname, __func__); + + /* reset device */ + upgt_set_led(sc, UPGT_LED_OFF); + (void)upgt_device_init(sc); +} + int upgt_detach(struct device *self, int flags) { @@ -472,6 +488,9 @@ upgt_detach(struct device *self, int flags) if_detach(ifp); } + if (sc->sc_sdhook != NULL) + shutdownhook_disestablish(sc->sc_sdhook); + splx(s); usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, &sc->sc_dev); |