void umidi_attach(struct device *parent, struct device *self, void *aux) { usbd_status err; struct umidi_softc *sc = (struct umidi_softc *)self; struct usb_attach_arg *uaa = aux; int i; DPRINTFN(1,("%s\n", __func__)); sc->sc_iface = uaa->iface; sc->sc_udev = uaa->device; sc->sc_quirk = umidi_search_quirk(uaa->vendor, uaa->product, uaa->ifaceno); printf("%s: ", sc->sc_dev.dv_xname); umidi_print_quirk(sc->sc_quirk); err = alloc_all_endpoints(sc); if (err!=USBD_NORMAL_COMPLETION) goto error; err = alloc_all_jacks(sc); if (err!=USBD_NORMAL_COMPLETION) { free_all_endpoints(sc); goto error; } printf("%s: out=%d, in=%d\n", sc->sc_dev.dv_xname, sc->sc_out_num_jacks, sc->sc_in_num_jacks); err = assign_all_jacks_automatically(sc); if (err!=USBD_NORMAL_COMPLETION) { unbind_all_jacks(sc); free_all_jacks(sc); free_all_endpoints(sc); goto error; } err = attach_all_mididevs(sc); if (err!=USBD_NORMAL_COMPLETION) { unbind_all_jacks(sc); free_all_jacks(sc); free_all_endpoints(sc); goto error; } #ifdef UMIDI_DEBUG dump_sc(sc); #endif for (i = 0; i < sc->sc_in_num_endpoints; i++) (void)start_input_transfer(&sc->sc_in_ep[i]); return; error: printf("%s: disabled.\n", sc->sc_dev.dv_xname); usbd_deactivate(sc->sc_udev); }
int umidi_detach(struct device *self, int flags) { struct umidi_softc *sc = (struct umidi_softc *)self; DPRINTFN(1,("%s\n", __func__)); detach_all_mididevs(sc, flags); free_all_mididevs(sc); free_all_jacks(sc); free_all_endpoints(sc); return 0; }
I2CEndpointBroker::~I2CEndpointBroker() throw() { free_all_endpoints(); }