diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/usb/umidi.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/sys/dev/usb/umidi.c b/sys/dev/usb/umidi.c index 58a8d5712e3..eaebdf36ec3 100644 --- a/sys/dev/usb/umidi.c +++ b/sys/dev/usb/umidi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: umidi.c,v 1.30 2011/06/23 22:03:43 oga Exp $ */ +/* $OpenBSD: umidi.c,v 1.31 2011/06/23 23:04:28 oga Exp $ */ /* $NetBSD: umidi.c,v 1.16 2002/07/11 21:14:32 augustss Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -84,6 +84,7 @@ static usbd_status bind_jacks_to_mididev(struct umidi_softc *, struct umidi_jack *, struct umidi_mididev *); static void unbind_jacks_from_mididev(struct umidi_mididev *); +static void unbind_all_jacks(struct umidi_softc *); static usbd_status assign_all_jacks_automatically(struct umidi_softc *); static usbd_status open_out_jack(struct umidi_jack *, void *, void (*)(void *)); @@ -193,7 +194,8 @@ umidi_attach(struct device *parent, struct device *self, void *aux) } err = alloc_all_jacks(sc); if (err!=USBD_NORMAL_COMPLETION) { - goto free_ends; + free_all_endpoints(sc); + goto error; } printf("%s: out=%d, in=%d\n", sc->sc_dev.dv_xname, @@ -201,12 +203,15 @@ umidi_attach(struct device *parent, struct device *self, void *aux) err = assign_all_jacks_automatically(sc); if (err!=USBD_NORMAL_COMPLETION) { - goto free_jacks; + unbind_all_jacks(sc); + free_all_jacks(sc); + free_all_endpoints(sc); + goto error; } err = attach_all_mididevs(sc); if (err!=USBD_NORMAL_COMPLETION) { - /* XXX what about the mididevs that attached? */ - goto free_mididevs; + free_all_jacks(sc); + free_all_endpoints(sc); } #ifdef UMIDI_DEBUG @@ -218,13 +223,6 @@ umidi_attach(struct device *parent, struct device *self, void *aux) } return; - -free_mididevs: - free_all_mididevs(sc); -free_jacks: - free_all_jacks(sc); -free_ends: - free_all_endpoints(sc); error: printf("%s: disabled.\n", sc->sc_dev.dv_xname); sc->sc_dying = 1; @@ -410,7 +408,7 @@ alloc_all_endpoints(struct umidi_softc *sc) err = alloc_all_endpoints_genuine(sc); } if (err!=USBD_NORMAL_COMPLETION) - free(sc->sc_endpoints, M_USBDEV); + return err; ep = sc->sc_endpoints; for (i=sc->sc_out_num_endpoints+sc->sc_in_num_endpoints; i>0; i--) { @@ -844,6 +842,17 @@ unbind_jacks_from_mididev(struct umidi_mididev *mididev) mididev->out_jack = mididev->in_jack = NULL; } +static void +unbind_all_jacks(struct umidi_softc *sc) +{ + int i; + + if (sc->sc_mididevs) + for (i=0; i<sc->sc_num_mididevs; i++) { + unbind_jacks_from_mididev(&sc->sc_mididevs[i]); + } +} + static usbd_status assign_all_jacks_automatically(struct umidi_softc *sc) { @@ -985,21 +994,16 @@ static usbd_status attach_all_mididevs(struct umidi_softc *sc) { usbd_status err; - int i, j; + int i; if (sc->sc_mididevs) for (i=0; i<sc->sc_num_mididevs; i++) { err = attach_mididev(sc, &sc->sc_mididevs[i]); if (err!=USBD_NORMAL_COMPLETION) - goto detach; + return err; } return USBD_NORMAL_COMPLETION; -detach: - - for (j = 0; j < i; j++) - (void)detach_mididev(&sc->sc_mididevs[i], DETACH_QUIET); - return err; } static usbd_status |