xref: /openbsd-src/sys/dev/usb/umidi.c (revision 4c1e55dc91edd6e69ccc60ce855900fbc12cf34f)
1 /*	$OpenBSD: umidi.c,v 1.33 2012/03/30 08:18:19 ratchov Exp $	*/
2 /*	$NetBSD: umidi.c,v 1.16 2002/07/11 21:14:32 augustss Exp $	*/
3 /*
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Takuya SHIOZAKI (tshiozak@netbsd.org).
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
35 #include <sys/malloc.h>
36 #include <sys/device.h>
37 #include <sys/ioctl.h>
38 #include <sys/conf.h>
39 #include <sys/file.h>
40 #include <sys/selinfo.h>
41 #include <sys/proc.h>
42 #include <sys/vnode.h>
43 #include <sys/poll.h>
44 
45 #include <dev/usb/usb.h>
46 #include <dev/usb/usbdi.h>
47 #include <dev/usb/usbdi_util.h>
48 
49 #include <dev/usb/usbdevs.h>
50 #include <dev/usb/uaudioreg.h>
51 #include <dev/usb/umidireg.h>
52 #include <dev/usb/umidivar.h>
53 #include <dev/usb/umidi_quirks.h>
54 
55 #include <dev/midi_if.h>
56 
57 #ifdef UMIDI_DEBUG
58 #define DPRINTF(x)	if (umididebug) printf x
59 #define DPRINTFN(n,x)	if (umididebug >= (n)) printf x
60 int	umididebug = 0;
61 #else
62 #define DPRINTF(x)
63 #define DPRINTFN(n,x)
64 #endif
65 
66 
67 static int umidi_open(void *, int,
68 		      void (*)(void *, int), void (*)(void *), void *);
69 static void umidi_close(void *);
70 static int umidi_output(void *, int);
71 static void umidi_flush(void *);
72 static void umidi_getinfo(void *, struct midi_info *);
73 
74 static usbd_status alloc_pipe(struct umidi_endpoint *);
75 static void free_pipe(struct umidi_endpoint *);
76 
77 static usbd_status alloc_all_endpoints(struct umidi_softc *);
78 static void free_all_endpoints(struct umidi_softc *);
79 
80 static usbd_status alloc_all_jacks(struct umidi_softc *);
81 static void free_all_jacks(struct umidi_softc *);
82 static usbd_status bind_jacks_to_mididev(struct umidi_softc *,
83 					 struct umidi_jack *,
84 					 struct umidi_jack *,
85 					 struct umidi_mididev *);
86 static void unbind_jacks_from_mididev(struct umidi_mididev *);
87 static void unbind_all_jacks(struct umidi_softc *);
88 static usbd_status assign_all_jacks_automatically(struct umidi_softc *);
89 static usbd_status open_out_jack(struct umidi_jack *, void *,
90 				 void (*)(void *));
91 static usbd_status open_in_jack(struct umidi_jack *, void *,
92 				void (*)(void *, int));
93 static void close_out_jack(struct umidi_jack *);
94 static void close_in_jack(struct umidi_jack *);
95 
96 static usbd_status attach_mididev(struct umidi_softc *,
97 				  struct umidi_mididev *);
98 static usbd_status detach_mididev(struct umidi_mididev *, int);
99 static usbd_status deactivate_mididev(struct umidi_mididev *);
100 static usbd_status alloc_all_mididevs(struct umidi_softc *, int);
101 static void free_all_mididevs(struct umidi_softc *);
102 static usbd_status attach_all_mididevs(struct umidi_softc *);
103 static usbd_status detach_all_mididevs(struct umidi_softc *, int);
104 static usbd_status deactivate_all_mididevs(struct umidi_softc *);
105 
106 #ifdef UMIDI_DEBUG
107 static void dump_sc(struct umidi_softc *);
108 static void dump_ep(struct umidi_endpoint *);
109 static void dump_jack(struct umidi_jack *);
110 #endif
111 
112 static void init_packet(struct umidi_packet *);
113 
114 static usbd_status start_input_transfer(struct umidi_endpoint *);
115 static usbd_status start_output_transfer(struct umidi_endpoint *);
116 static int out_jack_output(struct umidi_jack *, int);
117 static void out_jack_flush(struct umidi_jack *);
118 static void in_intr(usbd_xfer_handle, usbd_private_handle, usbd_status);
119 static void out_intr(usbd_xfer_handle, usbd_private_handle, usbd_status);
120 static int out_build_packet(int, struct umidi_packet *, uByte, u_char *);
121 
122 
123 struct midi_hw_if umidi_hw_if = {
124 	umidi_open,
125 	umidi_close,
126 	umidi_output,
127 	umidi_flush,		/* flush */
128 	umidi_getinfo,
129 	0,		/* ioctl */
130 };
131 
132 int umidi_match(struct device *, void *, void *);
133 void umidi_attach(struct device *, struct device *, void *);
134 int umidi_detach(struct device *, int);
135 int umidi_activate(struct device *, int);
136 
137 struct cfdriver umidi_cd = {
138 	NULL, "umidi", DV_DULL
139 };
140 
141 const struct cfattach umidi_ca = {
142 	sizeof(struct umidi_softc),
143 	umidi_match,
144 	umidi_attach,
145 	umidi_detach,
146 	umidi_activate,
147 };
148 
149 int
150 umidi_match(struct device *parent, void *match, void *aux)
151 {
152 	struct usb_attach_arg *uaa = aux;
153 	usb_interface_descriptor_t *id;
154 
155 	DPRINTFN(1,("umidi_match\n"));
156 
157 	if (uaa->iface == NULL)
158 		return UMATCH_NONE;
159 
160 	if (umidi_search_quirk(uaa->vendor, uaa->product, uaa->ifaceno))
161 		return UMATCH_IFACECLASS_IFACESUBCLASS;
162 
163 	id = usbd_get_interface_descriptor(uaa->iface);
164 	if (id!=NULL &&
165 	    id->bInterfaceClass==UICLASS_AUDIO &&
166 	    id->bInterfaceSubClass==UISUBCLASS_MIDISTREAM)
167 		return UMATCH_IFACECLASS_IFACESUBCLASS;
168 
169 	return UMATCH_NONE;
170 }
171 
172 void
173 umidi_attach(struct device *parent, struct device *self, void *aux)
174 {
175 	usbd_status err;
176 	struct umidi_softc *sc = (struct umidi_softc *)self;
177 	struct usb_attach_arg *uaa = aux;
178 	int i;
179 
180 	DPRINTFN(1,("umidi_attach\n"));
181 
182 	sc->sc_iface = uaa->iface;
183 	sc->sc_udev = uaa->device;
184 
185 	sc->sc_quirk =
186 	    umidi_search_quirk(uaa->vendor, uaa->product, uaa->ifaceno);
187 	printf("%s: ", sc->sc_dev.dv_xname);
188 	umidi_print_quirk(sc->sc_quirk);
189 
190 
191 	err = alloc_all_endpoints(sc);
192 	if (err!=USBD_NORMAL_COMPLETION) {
193 		goto error;
194 	}
195 	err = alloc_all_jacks(sc);
196 	if (err!=USBD_NORMAL_COMPLETION) {
197 		free_all_endpoints(sc);
198 		goto error;
199 	}
200 	printf("%s: out=%d, in=%d\n",
201 	       sc->sc_dev.dv_xname,
202 	       sc->sc_out_num_jacks, sc->sc_in_num_jacks);
203 
204 	err = assign_all_jacks_automatically(sc);
205 	if (err!=USBD_NORMAL_COMPLETION) {
206 		unbind_all_jacks(sc);
207 		free_all_jacks(sc);
208 		free_all_endpoints(sc);
209 		goto error;
210 	}
211 	err = attach_all_mididevs(sc);
212 	if (err!=USBD_NORMAL_COMPLETION) {
213 		free_all_jacks(sc);
214 		free_all_endpoints(sc);
215 	}
216 
217 #ifdef UMIDI_DEBUG
218 	dump_sc(sc);
219 #endif
220 
221 	for (i = 0; i < sc->sc_in_num_endpoints; i++) {
222 		(void)start_input_transfer(&sc->sc_in_ep[i]);
223 	}
224 
225 	return;
226 error:
227 	printf("%s: disabled.\n", sc->sc_dev.dv_xname);
228 	sc->sc_dying = 1;
229 }
230 
231 int
232 umidi_activate(struct device *self, int act)
233 {
234 	struct umidi_softc *sc = (struct umidi_softc *)self;
235 
236 	switch (act) {
237 	case DVACT_DEACTIVATE:
238 		DPRINTFN(1,("umidi_activate (deactivate)\n"));
239 		sc->sc_dying = 1;
240 		deactivate_all_mididevs(sc);
241 		break;
242 	}
243 	return 0;
244 }
245 
246 int
247 umidi_detach(struct device *self, int flags)
248 {
249 	struct umidi_softc *sc = (struct umidi_softc *)self;
250 
251 	DPRINTFN(1,("umidi_detach\n"));
252 
253 	detach_all_mididevs(sc, flags);
254 	free_all_mididevs(sc);
255 	free_all_jacks(sc);
256 	free_all_endpoints(sc);
257 
258 	return 0;
259 }
260 
261 
262 /*
263  * midi_if stuffs
264  */
265 int
266 umidi_open(void *addr,
267 	   int flags,
268 	   void (*iintr)(void *, int),
269 	   void (*ointr)(void *),
270 	   void *arg)
271 {
272 	struct umidi_mididev *mididev = addr;
273 	struct umidi_softc *sc = mididev->sc;
274 
275 	DPRINTF(("umidi_open: sc=%p\n", sc));
276 
277 	if (!sc)
278 		return ENXIO;
279 	if (mididev->opened)
280 		return EBUSY;
281 	if (sc->sc_dying)
282 		return EIO;
283 
284 	mididev->opened = 1;
285 	mididev->flags = flags;
286 	if ((mididev->flags & FWRITE) && mididev->out_jack)
287 		open_out_jack(mididev->out_jack, arg, ointr);
288 	if ((mididev->flags & FREAD) && mididev->in_jack) {
289 		open_in_jack(mididev->in_jack, arg, iintr);
290 	}
291 
292 	return 0;
293 }
294 
295 void
296 umidi_close(void *addr)
297 {
298 	int s;
299 	struct umidi_mididev *mididev = addr;
300 
301 	s = splusb();
302 	if ((mididev->flags & FWRITE) && mididev->out_jack)
303 		close_out_jack(mididev->out_jack);
304 	if ((mididev->flags & FREAD) && mididev->in_jack)
305 		close_in_jack(mididev->in_jack);
306 	mididev->opened = 0;
307 	splx(s);
308 }
309 
310 int
311 umidi_output(void *addr, int d)
312 {
313 	struct umidi_mididev *mididev = addr;
314 
315 	if (!mididev->out_jack || !mididev->opened)
316 		return 1;
317 
318 	return out_jack_output(mididev->out_jack, d);
319 }
320 
321 void
322 umidi_flush(void *addr)
323 {
324 	struct umidi_mididev *mididev = addr;
325 
326 	if (!mididev->out_jack || !mididev->opened)
327 		return;
328 
329 	return out_jack_flush(mididev->out_jack);
330 }
331 
332 void
333 umidi_getinfo(void *addr, struct midi_info *mi)
334 {
335 	struct umidi_mididev *mididev = addr;
336 
337 	mi->name = "USB MIDI I/F"; /* XXX: model name */
338 	mi->props = MIDI_PROP_OUT_INTR;
339 	if (mididev->in_jack)
340 		mi->props |= MIDI_PROP_CAN_INPUT;
341 }
342 
343 
344 /*
345  * each endpoint stuffs
346  */
347 
348 /* alloc/free pipe */
349 static usbd_status
350 alloc_pipe(struct umidi_endpoint *ep)
351 {
352 	struct umidi_softc *sc = ep->sc;
353 	usbd_status err;
354 
355 	DPRINTF(("%s: alloc_pipe %p\n", sc->sc_dev.dv_xname, ep));
356 	SIMPLEQ_INIT(&ep->intrq);
357 	ep->pending = 0;
358 	ep->busy = 0;
359 	ep->used = 0;
360 	ep->xfer = usbd_alloc_xfer(sc->sc_udev);
361 	if (ep->xfer == NULL) {
362 		return USBD_NOMEM;
363 	}
364 	ep->buffer = usbd_alloc_buffer(ep->xfer, ep->packetsize);
365 	if (ep->buffer == NULL) {
366 		usbd_free_xfer(ep->xfer);
367 		return USBD_NOMEM;
368 	}
369 	err = usbd_open_pipe(sc->sc_iface, ep->addr, 0, &ep->pipe);
370 	if (err != USBD_NORMAL_COMPLETION) {
371 		usbd_free_xfer(ep->xfer);
372 		return err;
373 	}
374 	return USBD_NORMAL_COMPLETION;
375 }
376 
377 static void
378 free_pipe(struct umidi_endpoint *ep)
379 {
380 	DPRINTF(("%s: free_pipe %p\n", ep->sc->sc_dev.dv_xname, ep));
381 	usbd_abort_pipe(ep->pipe);
382 	usbd_close_pipe(ep->pipe);
383 	usbd_free_xfer(ep->xfer);
384 }
385 
386 
387 /* alloc/free the array of endpoint structures */
388 
389 static usbd_status alloc_all_endpoints_fixed_ep(struct umidi_softc *);
390 static usbd_status alloc_all_endpoints_yamaha(struct umidi_softc *);
391 static usbd_status alloc_all_endpoints_genuine(struct umidi_softc *);
392 
393 static usbd_status
394 alloc_all_endpoints(struct umidi_softc *sc)
395 {
396 	usbd_status err;
397 	struct umidi_endpoint *ep;
398 	int i;
399 
400 	if (UMQ_ISTYPE(sc, UMQ_TYPE_FIXED_EP)) {
401 		err = alloc_all_endpoints_fixed_ep(sc);
402 	} else if (UMQ_ISTYPE(sc, UMQ_TYPE_YAMAHA)) {
403 		err = alloc_all_endpoints_yamaha(sc);
404 	} else {
405 		err = alloc_all_endpoints_genuine(sc);
406 	}
407 	if (err!=USBD_NORMAL_COMPLETION)
408 		return err;
409 
410 	ep = sc->sc_endpoints;
411 	for (i=sc->sc_out_num_endpoints+sc->sc_in_num_endpoints; i>0; i--) {
412 		err = alloc_pipe(ep);
413 		if (err!=USBD_NORMAL_COMPLETION) {
414 			while(ep != sc->sc_endpoints) {
415 				ep--;
416 				free_pipe(ep);
417 			}
418 			free(sc->sc_endpoints, M_USBDEV);
419 			sc->sc_endpoints = sc->sc_out_ep = sc->sc_in_ep = NULL;
420 			break;
421 		}
422 		ep++;
423 	}
424 	return err;
425 }
426 
427 static void
428 free_all_endpoints(struct umidi_softc *sc)
429 {
430 	int i;
431 	for (i=0; i<sc->sc_in_num_endpoints+sc->sc_out_num_endpoints; i++)
432 	    free_pipe(&sc->sc_endpoints[i]);
433 	if (sc->sc_endpoints != NULL)
434 		free(sc->sc_endpoints, M_USBDEV);
435 	sc->sc_endpoints = sc->sc_out_ep = sc->sc_in_ep = NULL;
436 }
437 
438 static usbd_status
439 alloc_all_endpoints_fixed_ep(struct umidi_softc *sc)
440 {
441 	usbd_status err;
442 	struct umq_fixed_ep_desc *fp;
443 	struct umidi_endpoint *ep;
444 	usb_endpoint_descriptor_t *epd;
445 	int i;
446 
447 	fp = umidi_get_quirk_data_from_type(sc->sc_quirk,
448 					    UMQ_TYPE_FIXED_EP);
449 	sc->sc_out_num_jacks = 0;
450 	sc->sc_in_num_jacks = 0;
451 	sc->sc_out_num_endpoints = fp->num_out_ep;
452 	sc->sc_in_num_endpoints = fp->num_in_ep;
453 	sc->sc_endpoints = malloc(sizeof(*sc->sc_out_ep)*
454 				  (sc->sc_out_num_endpoints+
455 				   sc->sc_in_num_endpoints),
456 				  M_USBDEV, M_WAITOK | M_CANFAIL);
457 	if (!sc->sc_endpoints) {
458 		return USBD_NOMEM;
459 	}
460 	sc->sc_out_ep = sc->sc_out_num_endpoints ? sc->sc_endpoints : NULL;
461 	sc->sc_in_ep =
462 	    sc->sc_in_num_endpoints ?
463 		sc->sc_endpoints+sc->sc_out_num_endpoints : NULL;
464 
465 	ep = &sc->sc_out_ep[0];
466 	for (i=0; i<sc->sc_out_num_endpoints; i++) {
467 		epd = usbd_interface2endpoint_descriptor(
468 			sc->sc_iface,
469 			fp->out_ep[i].ep);
470 		if (!epd) {
471 			DPRINTF(("%s: cannot get endpoint descriptor(out:%d)\n",
472 			       sc->sc_dev.dv_xname, fp->out_ep[i].ep));
473 			err = USBD_INVAL;
474 			goto error;
475 		}
476 		if (UE_GET_XFERTYPE(epd->bmAttributes)!=UE_BULK ||
477 		    UE_GET_DIR(epd->bEndpointAddress)!=UE_DIR_OUT) {
478 			printf("%s: illegal endpoint(out:%d)\n",
479 			       sc->sc_dev.dv_xname, fp->out_ep[i].ep);
480 			err = USBD_INVAL;
481 			goto error;
482 		}
483 		ep->sc = sc;
484 		ep->packetsize = UGETW(epd->wMaxPacketSize);
485 		ep->addr = epd->bEndpointAddress;
486 		ep->num_jacks = fp->out_ep[i].num_jacks;
487 		sc->sc_out_num_jacks += fp->out_ep[i].num_jacks;
488 		ep->num_open = 0;
489 		memset(ep->jacks, 0, sizeof(ep->jacks));
490 		ep++;
491 	}
492 	ep = &sc->sc_in_ep[0];
493 	for (i=0; i<sc->sc_in_num_endpoints; i++) {
494 		epd = usbd_interface2endpoint_descriptor(
495 			sc->sc_iface,
496 			fp->in_ep[i].ep);
497 		if (!epd) {
498 			DPRINTF(("%s: cannot get endpoint descriptor(in:%d)\n",
499 			       sc->sc_dev.dv_xname, fp->in_ep[i].ep));
500 			err = USBD_INVAL;
501 			goto error;
502 		}
503 		if (UE_GET_XFERTYPE(epd->bmAttributes)!=UE_BULK ||
504 		    UE_GET_DIR(epd->bEndpointAddress)!=UE_DIR_IN) {
505 			printf("%s: illegal endpoint(in:%d)\n",
506 			       sc->sc_dev.dv_xname, fp->in_ep[i].ep);
507 			err = USBD_INVAL;
508 			goto error;
509 		}
510 		ep->sc = sc;
511 		ep->addr = epd->bEndpointAddress;
512 		ep->packetsize = UGETW(epd->wMaxPacketSize);
513 		ep->num_jacks = fp->in_ep[i].num_jacks;
514 		sc->sc_in_num_jacks += fp->in_ep[i].num_jacks;
515 		ep->num_open = 0;
516 		memset(ep->jacks, 0, sizeof(ep->jacks));
517 		ep++;
518 	}
519 
520 	return USBD_NORMAL_COMPLETION;
521 error:
522 	free(sc->sc_endpoints, M_USBDEV);
523 	sc->sc_endpoints = NULL;
524 	return err;
525 }
526 
527 static usbd_status
528 alloc_all_endpoints_yamaha(struct umidi_softc *sc)
529 {
530 	/* This driver currently supports max 1in/1out bulk endpoints */
531 	usb_descriptor_t *desc;
532 	usb_endpoint_descriptor_t *epd;
533 	int out_addr, in_addr, in_packetsize, i;
534 	int dir;
535 	size_t remain, descsize;
536 
537 	sc->sc_out_num_jacks = sc->sc_in_num_jacks = 0;
538 	out_addr = in_addr = 0;
539 
540 	/* detect endpoints */
541 	desc = TO_D(usbd_get_interface_descriptor(sc->sc_iface));
542 	for (i=(int)TO_IFD(desc)->bNumEndpoints-1; i>=0; i--) {
543 		epd = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
544 		if (UE_GET_XFERTYPE(epd->bmAttributes) == UE_BULK) {
545 			dir = UE_GET_DIR(epd->bEndpointAddress);
546 			if (dir==UE_DIR_OUT && !out_addr)
547 				out_addr = epd->bEndpointAddress;
548 			else if (dir==UE_DIR_IN && !in_addr) {
549 				in_addr = epd->bEndpointAddress;
550 				in_packetsize = UGETW(epd->wMaxPacketSize);
551 			}
552 		}
553 	}
554 	desc = NEXT_D(desc);
555 
556 	/* count jacks */
557 	if (!(desc->bDescriptorType==UDESC_CS_INTERFACE &&
558 	      desc->bDescriptorSubtype==UMIDI_MS_HEADER))
559 		return USBD_INVAL;
560 	remain = (size_t)UGETW(TO_CSIFD(desc)->wTotalLength) -
561 		(size_t)desc->bLength;
562 	desc = NEXT_D(desc);
563 
564 	while (remain>=sizeof(usb_descriptor_t)) {
565 		descsize = desc->bLength;
566 		if (descsize>remain || descsize==0)
567 			break;
568 		if (desc->bDescriptorType==UDESC_CS_INTERFACE &&
569 		    remain>=UMIDI_JACK_DESCRIPTOR_SIZE) {
570 			if (desc->bDescriptorSubtype==UMIDI_OUT_JACK)
571 				sc->sc_out_num_jacks++;
572 			else if (desc->bDescriptorSubtype==UMIDI_IN_JACK)
573 				sc->sc_in_num_jacks++;
574 		}
575 		desc = NEXT_D(desc);
576 		remain-=descsize;
577 	}
578 
579 	/* validate some parameters */
580 	if (sc->sc_out_num_jacks>UMIDI_MAX_EPJACKS)
581 		sc->sc_out_num_jacks = UMIDI_MAX_EPJACKS;
582 	if (sc->sc_in_num_jacks>UMIDI_MAX_EPJACKS)
583 		sc->sc_in_num_jacks = UMIDI_MAX_EPJACKS;
584 	if (sc->sc_out_num_jacks && out_addr) {
585 		sc->sc_out_num_endpoints = 1;
586 	} else {
587 		sc->sc_out_num_endpoints = 0;
588 		sc->sc_out_num_jacks = 0;
589 	}
590 	if (sc->sc_in_num_jacks && in_addr) {
591 		sc->sc_in_num_endpoints = 1;
592 	} else {
593 		sc->sc_in_num_endpoints = 0;
594 		sc->sc_in_num_jacks = 0;
595 	}
596 	sc->sc_endpoints = malloc(sizeof(struct umidi_endpoint)*
597 				  (sc->sc_out_num_endpoints+
598 				   sc->sc_in_num_endpoints),
599 				  M_USBDEV, M_WAITOK | M_CANFAIL);
600 	if (!sc->sc_endpoints)
601 		return USBD_NOMEM;
602 	if (sc->sc_out_num_endpoints) {
603 		sc->sc_out_ep = sc->sc_endpoints;
604 		sc->sc_out_ep->sc = sc;
605 		sc->sc_out_ep->addr = out_addr;
606 		sc->sc_out_ep->packetsize = UGETW(epd->wMaxPacketSize);
607 		sc->sc_out_ep->num_jacks = sc->sc_out_num_jacks;
608 		sc->sc_out_ep->num_open = 0;
609 		memset(sc->sc_out_ep->jacks, 0, sizeof(sc->sc_out_ep->jacks));
610 	} else
611 		sc->sc_out_ep = NULL;
612 
613 	if (sc->sc_in_num_endpoints) {
614 		sc->sc_in_ep = sc->sc_endpoints+sc->sc_out_num_endpoints;
615 		sc->sc_in_ep->sc = sc;
616 		sc->sc_in_ep->addr = in_addr;
617 		sc->sc_in_ep->packetsize = in_packetsize;
618 		sc->sc_in_ep->num_jacks = sc->sc_in_num_jacks;
619 		sc->sc_in_ep->num_open = 0;
620 		memset(sc->sc_in_ep->jacks, 0, sizeof(sc->sc_in_ep->jacks));
621 	} else
622 		sc->sc_in_ep = NULL;
623 
624 	return USBD_NORMAL_COMPLETION;
625 }
626 
627 static usbd_status
628 alloc_all_endpoints_genuine(struct umidi_softc *sc)
629 {
630 	usb_interface_descriptor_t *interface_desc;
631 	usb_config_descriptor_t *config_desc;
632 	usb_descriptor_t *desc;
633 	int num_ep;
634 	size_t remain, descsize;
635 	struct umidi_endpoint *p, *q, *lowest, *endep, tmpep;
636 	int epaddr, eppacketsize;
637 
638 	interface_desc = usbd_get_interface_descriptor(sc->sc_iface);
639 	num_ep = interface_desc->bNumEndpoints;
640 	sc->sc_endpoints = p = malloc(sizeof(struct umidi_endpoint) * num_ep,
641 				      M_USBDEV, M_WAITOK | M_CANFAIL);
642 	if (!p)
643 		return USBD_NOMEM;
644 
645 	sc->sc_out_num_jacks = sc->sc_in_num_jacks = 0;
646 	sc->sc_out_num_endpoints = sc->sc_in_num_endpoints = 0;
647 	epaddr = -1;
648 
649 	/* get the list of endpoints for midi stream */
650 	config_desc = usbd_get_config_descriptor(sc->sc_udev);
651 	desc = (usb_descriptor_t *) config_desc;
652 	remain = (size_t)UGETW(config_desc->wTotalLength);
653 	while (remain>=sizeof(usb_descriptor_t)) {
654 		descsize = desc->bLength;
655 		if (descsize>remain || descsize==0)
656 			break;
657 		if (desc->bDescriptorType==UDESC_ENDPOINT &&
658 		    remain>=USB_ENDPOINT_DESCRIPTOR_SIZE &&
659 		    UE_GET_XFERTYPE(TO_EPD(desc)->bmAttributes) == UE_BULK) {
660 			epaddr = TO_EPD(desc)->bEndpointAddress;
661 			eppacketsize = UGETW(TO_EPD(desc)->wMaxPacketSize);
662 		} else if (desc->bDescriptorType==UDESC_CS_ENDPOINT &&
663 			   remain>=UMIDI_CS_ENDPOINT_DESCRIPTOR_SIZE &&
664 			   epaddr!=-1) {
665 			if (num_ep>0) {
666 				num_ep--;
667 				p->sc = sc;
668 				p->addr = epaddr;
669 				p->packetsize = eppacketsize;
670 				p->num_jacks = TO_CSEPD(desc)->bNumEmbMIDIJack;
671 				if (UE_GET_DIR(epaddr)==UE_DIR_OUT) {
672 					sc->sc_out_num_endpoints++;
673 					sc->sc_out_num_jacks += p->num_jacks;
674 				} else {
675 					sc->sc_in_num_endpoints++;
676 					sc->sc_in_num_jacks += p->num_jacks;
677 				}
678 				p++;
679 			}
680 		} else
681 			epaddr = -1;
682 		desc = NEXT_D(desc);
683 		remain-=descsize;
684 	}
685 
686 	/* sort endpoints */
687 	num_ep = sc->sc_out_num_endpoints + sc->sc_in_num_endpoints;
688 	p = sc->sc_endpoints;
689 	endep = p + num_ep;
690 	while (p<endep) {
691 		lowest = p;
692 		for (q=p+1; q<endep; q++) {
693 			if ((UE_GET_DIR(lowest->addr)==UE_DIR_IN &&
694 			     UE_GET_DIR(q->addr)==UE_DIR_OUT) ||
695 			    ((UE_GET_DIR(lowest->addr)==
696 			      UE_GET_DIR(q->addr)) &&
697 			     (UE_GET_ADDR(lowest->addr)>
698 			      UE_GET_ADDR(q->addr))))
699 				lowest = q;
700 		}
701 		if (lowest != p) {
702 			memcpy((void *)&tmpep, (void *)p, sizeof(tmpep));
703 			memcpy((void *)p, (void *)lowest, sizeof(tmpep));
704 			memcpy((void *)lowest, (void *)&tmpep, sizeof(tmpep));
705 		}
706 		p->num_open = 0;
707 		p++;
708 	}
709 
710 	sc->sc_out_ep = sc->sc_out_num_endpoints ? sc->sc_endpoints : NULL;
711 	sc->sc_in_ep =
712 	    sc->sc_in_num_endpoints ?
713 		sc->sc_endpoints+sc->sc_out_num_endpoints : NULL;
714 
715 	return USBD_NORMAL_COMPLETION;
716 }
717 
718 
719 /*
720  * jack stuffs
721  */
722 
723 static usbd_status
724 alloc_all_jacks(struct umidi_softc *sc)
725 {
726 	int i, j;
727 	struct umidi_endpoint *ep;
728 	struct umidi_jack *jack, **rjack;
729 
730 	/* allocate/initialize structures */
731 	sc->sc_jacks =
732 	    malloc(sizeof(*sc->sc_out_jacks)*(sc->sc_in_num_jacks+
733 					      sc->sc_out_num_jacks),
734 		   M_USBDEV, M_WAITOK | M_CANFAIL);
735 	if (!sc->sc_jacks)
736 		return USBD_NOMEM;
737 	sc->sc_out_jacks =
738 	    sc->sc_out_num_jacks ? sc->sc_jacks : NULL;
739 	sc->sc_in_jacks =
740 	    sc->sc_in_num_jacks ? sc->sc_jacks+sc->sc_out_num_jacks : NULL;
741 
742 	jack = &sc->sc_out_jacks[0];
743 	for (i=0; i<sc->sc_out_num_jacks; i++) {
744 		jack->opened = 0;
745 		jack->binded = 0;
746 		jack->arg = NULL;
747 		jack->u.out.intr = NULL;
748 		jack->intr = 0;
749 		jack->cable_number = i;
750 		jack++;
751 	}
752 	jack = &sc->sc_in_jacks[0];
753 	for (i=0; i<sc->sc_in_num_jacks; i++) {
754 		jack->opened = 0;
755 		jack->binded = 0;
756 		jack->arg = NULL;
757 		jack->u.in.intr = NULL;
758 		jack->cable_number = i;
759 		jack++;
760 	}
761 
762 	/* assign each jacks to each endpoints */
763 	jack = &sc->sc_out_jacks[0];
764 	ep = &sc->sc_out_ep[0];
765 	for (i=0; i<sc->sc_out_num_endpoints; i++) {
766 		rjack = &ep->jacks[0];
767 		for (j=0; j<ep->num_jacks; j++) {
768 			*rjack = jack;
769 			jack->endpoint = ep;
770 			jack++;
771 			rjack++;
772 		}
773 		ep++;
774 	}
775 	jack = &sc->sc_in_jacks[0];
776 	ep = &sc->sc_in_ep[0];
777 	for (i=0; i<sc->sc_in_num_endpoints; i++) {
778 		rjack = &ep->jacks[0];
779 		for (j=0; j<ep->num_jacks; j++) {
780 			*rjack = jack;
781 			jack->endpoint = ep;
782 			jack++;
783 			rjack++;
784 		}
785 		ep++;
786 	}
787 
788 	return USBD_NORMAL_COMPLETION;
789 }
790 
791 static void
792 free_all_jacks(struct umidi_softc *sc)
793 {
794 	int s;
795 
796 	s = splaudio();
797 	if (sc->sc_out_jacks) {
798 		free(sc->sc_jacks, M_USBDEV);
799 		sc->sc_jacks = sc->sc_in_jacks = sc->sc_out_jacks = NULL;
800 	}
801 	splx(s);
802 }
803 
804 static usbd_status
805 bind_jacks_to_mididev(struct umidi_softc *sc,
806 		      struct umidi_jack *out_jack,
807 		      struct umidi_jack *in_jack,
808 		      struct umidi_mididev *mididev)
809 {
810 	if ((out_jack && out_jack->binded) || (in_jack && in_jack->binded))
811 		return USBD_IN_USE;
812 	if (mididev->out_jack || mididev->in_jack)
813 		return USBD_IN_USE;
814 
815 	if (out_jack)
816 		out_jack->binded = 1;
817 	if (in_jack)
818 		in_jack->binded = 1;
819 	mididev->in_jack = in_jack;
820 	mididev->out_jack = out_jack;
821 
822 	return USBD_NORMAL_COMPLETION;
823 }
824 
825 static void
826 unbind_jacks_from_mididev(struct umidi_mididev *mididev)
827 {
828 	if ((mididev->flags & FWRITE) && mididev->out_jack)
829 		close_out_jack(mididev->out_jack);
830 	if ((mididev->flags & FREAD) && mididev->in_jack)
831 		close_in_jack(mididev->in_jack);
832 
833 	if (mididev->out_jack)
834 		mididev->out_jack->binded = 0;
835 	if (mididev->in_jack)
836 		mididev->in_jack->binded = 0;
837 	mididev->out_jack = mididev->in_jack = NULL;
838 }
839 
840 static void
841 unbind_all_jacks(struct umidi_softc *sc)
842 {
843 	int i;
844 
845 	if (sc->sc_mididevs)
846 		for (i=0; i<sc->sc_num_mididevs; i++) {
847 			unbind_jacks_from_mididev(&sc->sc_mididevs[i]);
848 		}
849 }
850 
851 static usbd_status
852 assign_all_jacks_automatically(struct umidi_softc *sc)
853 {
854 	usbd_status err;
855 	int i;
856 	struct umidi_jack *out, *in;
857 
858 	err =
859 	    alloc_all_mididevs(sc,
860 			       max(sc->sc_out_num_jacks, sc->sc_in_num_jacks));
861 	if (err!=USBD_NORMAL_COMPLETION)
862 		return err;
863 
864 	for (i=0; i<sc->sc_num_mididevs; i++) {
865 		out = (i<sc->sc_out_num_jacks) ? &sc->sc_out_jacks[i]:NULL;
866 		in = (i<sc->sc_in_num_jacks) ? &sc->sc_in_jacks[i]:NULL;
867 		err = bind_jacks_to_mididev(sc, out, in, &sc->sc_mididevs[i]);
868 		if (err!=USBD_NORMAL_COMPLETION) {
869 			free_all_mididevs(sc);
870 			return err;
871 		}
872 	}
873 
874 	return USBD_NORMAL_COMPLETION;
875 }
876 
877 static usbd_status
878 open_out_jack(struct umidi_jack *jack, void *arg, void (*intr)(void *))
879 {
880 	if (jack->opened)
881 		return USBD_IN_USE;
882 
883 	jack->arg = arg;
884 	jack->u.out.intr = intr;
885 	init_packet(&jack->packet);
886 	jack->opened = 1;
887 	jack->endpoint->num_open++;
888 
889 	return USBD_NORMAL_COMPLETION;
890 }
891 
892 static usbd_status
893 open_in_jack(struct umidi_jack *jack, void *arg, void (*intr)(void *, int))
894 {
895 	if (jack->opened)
896 		return USBD_IN_USE;
897 
898 	jack->arg = arg;
899 	jack->u.in.intr = intr;
900 	jack->opened = 1;
901 	jack->endpoint->num_open++;
902 
903 	return USBD_NORMAL_COMPLETION;
904 }
905 
906 static void
907 close_out_jack(struct umidi_jack *jack)
908 {
909 	if (jack->opened) {
910 		jack->opened = 0;
911 		jack->endpoint->num_open--;
912 	}
913 }
914 
915 static void
916 close_in_jack(struct umidi_jack *jack)
917 {
918 	if (jack->opened) {
919 		jack->opened = 0;
920 		jack->endpoint->num_open--;
921 	}
922 }
923 
924 static usbd_status
925 attach_mididev(struct umidi_softc *sc, struct umidi_mididev *mididev)
926 {
927 	if (mididev->sc)
928 		return USBD_IN_USE;
929 
930 	mididev->sc = sc;
931 
932 	mididev->mdev = midi_attach_mi(&umidi_hw_if, mididev, &sc->sc_dev);
933 
934 	return USBD_NORMAL_COMPLETION;
935 }
936 
937 static usbd_status
938 detach_mididev(struct umidi_mididev *mididev, int flags)
939 {
940 	if (!mididev->sc)
941 		return USBD_NO_ADDR;
942 
943 	if (mididev->opened) {
944 		umidi_close(mididev);
945 	}
946 	unbind_jacks_from_mididev(mididev);
947 
948 	if (mididev->mdev)
949 		config_detach(mididev->mdev, flags);
950 
951 	mididev->sc = NULL;
952 
953 	return USBD_NORMAL_COMPLETION;
954 }
955 
956 static usbd_status
957 deactivate_mididev(struct umidi_mididev *mididev)
958 {
959 	if (mididev->out_jack)
960 		mididev->out_jack->binded = 0;
961 	if (mididev->in_jack)
962 		mididev->in_jack->binded = 0;
963 	config_deactivate(mididev->mdev);
964 
965 	return USBD_NORMAL_COMPLETION;
966 }
967 
968 static usbd_status
969 alloc_all_mididevs(struct umidi_softc *sc, int nmidi)
970 {
971 	sc->sc_num_mididevs = nmidi;
972 	sc->sc_mididevs = malloc(sizeof(*sc->sc_mididevs)*nmidi, M_USBDEV,
973 	    M_WAITOK | M_CANFAIL | M_ZERO);
974 	if (!sc->sc_mididevs)
975 		return USBD_NOMEM;
976 
977 	return USBD_NORMAL_COMPLETION;
978 }
979 
980 static void
981 free_all_mididevs(struct umidi_softc *sc)
982 {
983 	sc->sc_num_mididevs = 0;
984 	if (sc->sc_mididevs)
985 		free(sc->sc_mididevs, M_USBDEV);
986 }
987 
988 static usbd_status
989 attach_all_mididevs(struct umidi_softc *sc)
990 {
991 	usbd_status err;
992 	int i;
993 
994 	if (sc->sc_mididevs)
995 		for (i=0; i<sc->sc_num_mididevs; i++) {
996 			err = attach_mididev(sc, &sc->sc_mididevs[i]);
997 			if (err!=USBD_NORMAL_COMPLETION)
998 				return err;
999 		}
1000 
1001 	return USBD_NORMAL_COMPLETION;
1002 }
1003 
1004 static usbd_status
1005 detach_all_mididevs(struct umidi_softc *sc, int flags)
1006 {
1007 	usbd_status err;
1008 	int i;
1009 
1010 	if (sc->sc_mididevs)
1011 		for (i=0; i<sc->sc_num_mididevs; i++) {
1012 			err = detach_mididev(&sc->sc_mididevs[i], flags);
1013 			if (err!=USBD_NORMAL_COMPLETION)
1014 				return err;
1015 		}
1016 
1017 	return USBD_NORMAL_COMPLETION;
1018 }
1019 
1020 static usbd_status
1021 deactivate_all_mididevs(struct umidi_softc *sc)
1022 {
1023 	usbd_status err;
1024 	int i;
1025 
1026 	if (sc->sc_mididevs)
1027 		for (i=0; i<sc->sc_num_mididevs; i++) {
1028 			err = deactivate_mididev(&sc->sc_mididevs[i]);
1029 			if (err!=USBD_NORMAL_COMPLETION)
1030 				return err;
1031 		}
1032 
1033 	return USBD_NORMAL_COMPLETION;
1034 }
1035 
1036 #ifdef UMIDI_DEBUG
1037 static void
1038 dump_sc(struct umidi_softc *sc)
1039 {
1040 	int i;
1041 
1042 	DPRINTFN(10, ("%s: dump_sc\n", sc->sc_dev.dv_xname));
1043 	for (i=0; i<sc->sc_out_num_endpoints; i++) {
1044 		DPRINTFN(10, ("\tout_ep(%p):\n", &sc->sc_out_ep[i]));
1045 		dump_ep(&sc->sc_out_ep[i]);
1046 	}
1047 	for (i=0; i<sc->sc_in_num_endpoints; i++) {
1048 		DPRINTFN(10, ("\tin_ep(%p):\n", &sc->sc_in_ep[i]));
1049 		dump_ep(&sc->sc_in_ep[i]);
1050 	}
1051 }
1052 
1053 static void
1054 dump_ep(struct umidi_endpoint *ep)
1055 {
1056 	int i;
1057 	for (i=0; i<ep->num_jacks; i++) {
1058 		DPRINTFN(10, ("\t\tjack(%p):\n", ep->jacks[i]));
1059 		dump_jack(ep->jacks[i]);
1060 	}
1061 }
1062 static void
1063 dump_jack(struct umidi_jack *jack)
1064 {
1065 	DPRINTFN(10, ("\t\t\tep=%p\n",
1066 		      jack->endpoint));
1067 }
1068 
1069 #endif /* UMIDI_DEBUG */
1070 
1071 
1072 
1073 /*
1074  * MUX MIDI PACKET
1075  */
1076 
1077 static const int packet_length[16] = {
1078 	/*0*/	-1,
1079 	/*1*/	-1,
1080 	/*2*/	2,
1081 	/*3*/	3,
1082 	/*4*/	3,
1083 	/*5*/	1,
1084 	/*6*/	2,
1085 	/*7*/	3,
1086 	/*8*/	3,
1087 	/*9*/	3,
1088 	/*A*/	3,
1089 	/*B*/	3,
1090 	/*C*/	2,
1091 	/*D*/	2,
1092 	/*E*/	3,
1093 	/*F*/	1,
1094 };
1095 
1096 #define	GET_CN(p)		(((unsigned char)(p)>>4)&0x0F)
1097 #define GET_CIN(p)		((unsigned char)(p)&0x0F)
1098 #define MIX_CN_CIN(cn, cin) \
1099 	((unsigned char)((((unsigned char)(cn)&0x0F)<<4)| \
1100 			  ((unsigned char)(cin)&0x0F)))
1101 
1102 static void
1103 init_packet(struct umidi_packet *packet)
1104 {
1105 	packet->status = 0;
1106 	packet->index = 0;
1107 }
1108 
1109 static usbd_status
1110 start_input_transfer(struct umidi_endpoint *ep)
1111 {
1112 	usbd_status err;
1113 	usbd_setup_xfer(ep->xfer, ep->pipe,
1114 			(usbd_private_handle)ep,
1115 			ep->buffer, ep->packetsize,
1116 			USBD_SHORT_XFER_OK | USBD_NO_COPY, USBD_NO_TIMEOUT, in_intr);
1117 	err = usbd_transfer(ep->xfer);
1118 	if (err != USBD_NORMAL_COMPLETION && err != USBD_IN_PROGRESS) {
1119 		DPRINTF(("%s: start_input_transfer: usbd_transfer() failed err=%s\n",
1120 			ep->sc->sc_dev.dv_xname, usbd_errstr(err)));
1121 		return err;
1122 	}
1123 	return USBD_NORMAL_COMPLETION;
1124 }
1125 
1126 static usbd_status
1127 start_output_transfer(struct umidi_endpoint *ep)
1128 {
1129 	usbd_status err;
1130 	usbd_setup_xfer(ep->xfer, ep->pipe,
1131 			(usbd_private_handle)ep,
1132 			ep->buffer, ep->used,
1133 			USBD_NO_COPY, USBD_NO_TIMEOUT, out_intr);
1134 	err = usbd_transfer(ep->xfer);
1135 	if (err != USBD_NORMAL_COMPLETION && err != USBD_IN_PROGRESS) {
1136 		DPRINTF(("%s: start_output_transfer: usbd_transfer() failed err=%s\n",
1137 			ep->sc->sc_dev.dv_xname, usbd_errstr(err)));
1138 		return err;
1139 	}
1140 	ep->used = ep->packetsize;
1141 	return USBD_NORMAL_COMPLETION;
1142 }
1143 
1144 
1145 #ifdef UMIDI_DEBUG
1146 #define DPR_PACKET(dir, sc, p)						\
1147 	DPRINTFN(500,							\
1148 		 ("%s: umidi packet(" #dir "): %02X %02X %02X %02X\n",	\
1149 		  sc->sc_dev.dv_xname,				\
1150 		  (unsigned char)(p)->buffer[0],			\
1151 		  (unsigned char)(p)->buffer[1],			\
1152 		  (unsigned char)(p)->buffer[2],			\
1153 		  (unsigned char)(p)->buffer[3]));
1154 #else
1155 #define DPR_PACKET(dir, sc, p)
1156 #endif
1157 
1158 static int
1159 out_jack_output(struct umidi_jack *j, int d)
1160 {
1161 	struct umidi_endpoint *ep = j->endpoint;
1162 	struct umidi_softc *sc = ep->sc;
1163 	int s;
1164 
1165 	if (sc->sc_dying)
1166 		return 1;
1167 	if (!j->opened)
1168 		return 1;
1169 	s = splusb();
1170 	if (ep->busy) {
1171 		if (!j->intr) {
1172 			SIMPLEQ_INSERT_TAIL(&ep->intrq, j, intrq_entry);
1173 			ep->pending++;
1174 			j->intr = 1;
1175 		}
1176 		splx(s);
1177 		return 0;
1178 	}
1179 	if (!out_build_packet(j->cable_number, &j->packet, d,
1180 		ep->buffer + ep->used)) {
1181 		splx(s);
1182 		return 1;
1183 	}
1184 	ep->used += UMIDI_PACKET_SIZE;
1185 	if (ep->used == ep->packetsize) {
1186 		ep->busy = 1;
1187 		start_output_transfer(ep);
1188 	}
1189 	splx(s);
1190 	return 1;
1191 }
1192 
1193 static void
1194 out_jack_flush(struct umidi_jack *j)
1195 {
1196 	struct umidi_endpoint *ep = j->endpoint;
1197 	int s;
1198 
1199 	if (ep->sc->sc_dying || !j->opened)
1200 		return;
1201 
1202 	s = splusb();
1203 	if (ep->used != 0 && !ep->busy) {
1204 		ep->busy = 1;
1205 		start_output_transfer(ep);
1206 	}
1207 	splx(s);
1208 }
1209 
1210 
1211 static void
1212 in_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
1213 {
1214 	int cn, evlen, remain, i;
1215 	unsigned char *buf;
1216 	struct umidi_endpoint *ep = (struct umidi_endpoint *)priv;
1217 	struct umidi_jack *jack;
1218 
1219 	if (ep->sc->sc_dying)
1220 		return;
1221 
1222 	usbd_get_xfer_status(xfer, NULL, NULL, &remain, NULL);
1223 	if (status != USBD_NORMAL_COMPLETION) {
1224 		DPRINTF(("in_intr: abnormal status: %s\n", usbd_errstr(status)));
1225 		return;
1226 	}
1227 	buf = ep->buffer;
1228 	while (remain >= UMIDI_PACKET_SIZE) {
1229 		cn = GET_CN(buf[0]);
1230 		if (cn < ep->num_jacks && (jack = ep->jacks[cn]) &&
1231 		    jack->binded && jack->opened &&  jack->u.in.intr) {
1232 		    	evlen = packet_length[GET_CIN(buf[0])];
1233 			for (i=0; i<evlen; i++)
1234 				(*jack->u.in.intr)(jack->arg, buf[i+1]);
1235 		}
1236 		buf += UMIDI_PACKET_SIZE;
1237 		remain -= UMIDI_PACKET_SIZE;
1238 	}
1239 	(void)start_input_transfer(ep);
1240 }
1241 
1242 static void
1243 out_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
1244 {
1245 	struct umidi_endpoint *ep = (struct umidi_endpoint *)priv;
1246 	struct umidi_softc *sc = ep->sc;
1247 	struct umidi_jack *j;
1248 	unsigned pending;
1249 
1250 	if (sc->sc_dying)
1251 		return;
1252 
1253 	ep->used = 0;
1254 	ep->busy = 0;
1255 	for (pending = ep->pending; pending > 0; pending--) {
1256 		j = SIMPLEQ_FIRST(&ep->intrq);
1257 #ifdef DIAGNOSTIC
1258 		if (j == NULL) {
1259 			printf("umidi: missing intr entry\n");
1260 			break;
1261 		}
1262 #endif
1263 		SIMPLEQ_REMOVE_HEAD(&ep->intrq, intrq_entry);
1264 		ep->pending--;
1265 		j->intr = 0;
1266 		if (j->opened && j->u.out.intr)
1267 			(*j->u.out.intr)(j->arg);
1268 	}
1269 }
1270 
1271 #define UMIDI_VOICELEN(status) 	(umidi_evlen[((status) >> 4) & 7])
1272 unsigned umidi_evlen[] = { 4, 4, 4, 4, 3, 3, 4 };
1273 
1274 #define EV_SYSEX	0xf0
1275 #define EV_MTC		0xf1
1276 #define EV_SPP		0xf2
1277 #define EV_SONGSEL	0xf3
1278 #define EV_TUNE_REQ	0xf6
1279 #define EV_SYSEX_STOP	0xf7
1280 
1281 static int
1282 out_build_packet(int cable_number, struct umidi_packet *packet,
1283     uByte data, u_char *obuf)
1284 {
1285 	if (data >= 0xf8) {		/* is it a realtime message ? */
1286 		obuf[0] = data >> 4 | cable_number << 4;
1287 		obuf[1] = data;
1288 		obuf[2] = 0;
1289 		obuf[3] = 0;
1290 		return 1;
1291 	}
1292 	if (data >= 0xf0) {		/* is it a common message ? */
1293 		switch(data) {
1294 		case EV_SYSEX:
1295 			packet->buf[1] = packet->status = data;
1296 			packet->index = 2;
1297 			break;
1298 		case EV_SYSEX_STOP:
1299 			if (packet->status != EV_SYSEX) break;
1300 			if (packet->index == 0)
1301 				packet->index = 1;
1302 			packet->status = data;
1303 			packet->buf[packet->index++] = data;
1304 			packet->buf[0] = (0x4 - 1 + packet->index) | cable_number << 4;
1305 			goto packetready;
1306 		case EV_TUNE_REQ:
1307 			packet->status = data;
1308 			packet->buf[0] = 0x5 | cable_number << 4;
1309 			packet->index = 1;
1310 			goto packetready;
1311 		default:
1312 			packet->status = data;
1313 			break;
1314 		}
1315 		return 0;
1316 	}
1317 	if (data >= 0x80) {		/* is it a voice message ? */
1318 		packet->status = data;
1319 		packet->index = 0;
1320 		return 0;
1321 	}
1322 
1323 	/* else it is a data byte */
1324 	if (packet->status >= 0xf0) {
1325 		switch(packet->status) {
1326 		case EV_SYSEX:		/* sysex starts or continues */
1327 			if (packet->index == 0)
1328 				packet->index = 1;
1329 
1330 			packet->buf[packet->index++] = data;
1331 			if (packet->index >= UMIDI_PACKET_SIZE) {
1332 				packet->buf[0] = 0x4 | cable_number << 4;
1333 				goto packetready;
1334 			}
1335 			break;
1336 		case EV_MTC:		/* messages with 1 data byte */
1337 		case EV_SONGSEL:
1338 			packet->buf[0] = 0x2 | cable_number << 4;
1339 			packet->buf[1] = packet->status;
1340 			packet->buf[2] = data;
1341 			packet->index = 3;
1342 			goto packetready;
1343 		case EV_SPP:		/* messages with 2 data bytes */
1344 			if (packet->index == 0) {
1345 				packet->buf[0] = 0x3 | cable_number << 4;
1346 				packet->index = 1;
1347 			}
1348 			packet->buf[packet->index++] = data;
1349 			if (packet->index >= UMIDI_PACKET_SIZE) {
1350 				packet->buf[1] = packet->status;
1351 				goto packetready;
1352 			}
1353 			break;
1354 		default:		/* ignore data with unknown status */
1355 			break;
1356 		}
1357 		return 0;
1358 	}
1359 	if (packet->status >= 0x80) {	/* is it a voice message ? */
1360 		if (packet->index == 0) {
1361 			packet->buf[0] = packet->status >> 4 | cable_number << 4;
1362 			packet->buf[1] = packet->status;
1363 			packet->index = 2;
1364 		}
1365 		packet->buf[packet->index++] = data;
1366 		if (packet->index >= UMIDI_VOICELEN(packet->status))
1367 			goto packetready;
1368 	}
1369 	/* ignore data with unknown status */
1370 	return 0;
1371 
1372 packetready:
1373 	while (packet->index < UMIDI_PACKET_SIZE)
1374 		packet->buf[packet->index++] = 0;
1375 	packet->index = 0;
1376 	memcpy(obuf, packet->buf, UMIDI_PACKET_SIZE);
1377 	return 1;
1378 }
1379