xref: /freebsd/sys/dev/sound/usb/uaudio.c (revision ca27f0cef04fe67c812aae3568211798f52f28ee)
1 /*	$NetBSD: uaudio.c,v 1.91 2004/11/05 17:46:14 kent Exp $	*/
2 /*	$FreeBSD$ */
3 
4 /*-
5  * Copyright (c) 1999 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Lennart Augustsson (lennart@augustsson.net) at
10  * Carlstedt Research & Technology.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include <sys/cdefs.h>
35 __FBSDID("$FreeBSD$");
36 
37 /*
38  * USB audio specs: http://www.usb.org/developers/devclass_docs/audio10.pdf
39  *                  http://www.usb.org/developers/devclass_docs/frmts10.pdf
40  *                  http://www.usb.org/developers/devclass_docs/termt10.pdf
41  */
42 
43 /*
44  * Also merged:
45  *  $NetBSD: uaudio.c,v 1.94 2005/01/15 15:19:53 kent Exp $
46  *  $NetBSD: uaudio.c,v 1.95 2005/01/16 06:02:19 dsainty Exp $
47  *  $NetBSD: uaudio.c,v 1.96 2005/01/16 12:46:00 kent Exp $
48  *  $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $
49  */
50 
51 #include <sys/stdint.h>
52 #include <sys/stddef.h>
53 #include <sys/param.h>
54 #include <sys/queue.h>
55 #include <sys/types.h>
56 #include <sys/systm.h>
57 #include <sys/kernel.h>
58 #include <sys/bus.h>
59 #include <sys/module.h>
60 #include <sys/lock.h>
61 #include <sys/mutex.h>
62 #include <sys/condvar.h>
63 #include <sys/sysctl.h>
64 #include <sys/sx.h>
65 #include <sys/unistd.h>
66 #include <sys/callout.h>
67 #include <sys/malloc.h>
68 #include <sys/priv.h>
69 
70 #include "usbdevs.h"
71 #include <dev/usb/usb.h>
72 #include <dev/usb/usbdi.h>
73 #include <dev/usb/usbdi_util.h>
74 
75 #define	USB_DEBUG_VAR uaudio_debug
76 #include <dev/usb/usb_debug.h>
77 
78 #include <dev/usb/quirk/usb_quirk.h>
79 
80 #include <sys/reboot.h>			/* for bootverbose */
81 
82 #ifdef HAVE_KERNEL_OPTION_HEADERS
83 #include "opt_snd.h"
84 #endif
85 
86 #include <dev/sound/pcm/sound.h>
87 #include <dev/sound/usb/uaudioreg.h>
88 #include <dev/sound/usb/uaudio.h>
89 #include <dev/sound/chip.h>
90 #include "feeder_if.h"
91 
92 static int uaudio_default_rate = 0;		/* use rate list */
93 static int uaudio_default_bits = 32;
94 static int uaudio_default_channels = 0;		/* use default */
95 
96 #ifdef USB_DEBUG
97 static int uaudio_debug = 0;
98 
99 static SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio");
100 
101 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW,
102     &uaudio_debug, 0, "uaudio debug level");
103 
104 TUNABLE_INT("hw.usb.uaudio.default_rate", &uaudio_default_rate);
105 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_rate, CTLFLAG_RW,
106     &uaudio_default_rate, 0, "uaudio default sample rate");
107 
108 TUNABLE_INT("hw.usb.uaudio.default_bits", &uaudio_default_bits);
109 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RW,
110     &uaudio_default_bits, 0, "uaudio default sample bits");
111 
112 TUNABLE_INT("hw.usb.uaudio.default_channels", &uaudio_default_channels);
113 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RW,
114     &uaudio_default_channels, 0, "uaudio default sample channels");
115 #endif
116 
117 #define	UAUDIO_NFRAMES		64	/* must be factor of 8 due HS-USB */
118 #define	UAUDIO_NCHANBUFS        2	/* number of outstanding request */
119 #define	UAUDIO_RECURSE_LIMIT   24	/* rounds */
120 
121 #define	MAKE_WORD(h,l) (((h) << 8) | (l))
122 #define	BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1)
123 #define	UAUDIO_MAX_CHAN(x) (x)
124 
125 struct uaudio_mixer_node {
126 	int32_t	minval;
127 	int32_t	maxval;
128 #define	MIX_MAX_CHAN 8
129 	int32_t	wValue[MIX_MAX_CHAN];	/* using nchan */
130 	uint32_t mul;
131 	uint32_t ctl;
132 
133 	uint16_t wData[MIX_MAX_CHAN];	/* using nchan */
134 	uint16_t wIndex;
135 
136 	uint8_t	update[(MIX_MAX_CHAN + 7) / 8];
137 	uint8_t	nchan;
138 	uint8_t	type;
139 #define	MIX_ON_OFF	1
140 #define	MIX_SIGNED_16	2
141 #define	MIX_UNSIGNED_16	3
142 #define	MIX_SIGNED_8	4
143 #define	MIX_SELECTOR	5
144 #define	MIX_UNKNOWN     6
145 #define	MIX_SIZE(n) ((((n) == MIX_SIGNED_16) || \
146 		      ((n) == MIX_UNSIGNED_16)) ? 2 : 1)
147 #define	MIX_UNSIGNED(n) ((n) == MIX_UNSIGNED_16)
148 
149 #define	MAX_SELECTOR_INPUT_PIN 256
150 	uint8_t	slctrtype[MAX_SELECTOR_INPUT_PIN];
151 	uint8_t	class;
152 
153 	struct uaudio_mixer_node *next;
154 };
155 
156 struct uaudio_chan {
157 	struct pcmchan_caps pcm_cap;	/* capabilities */
158 
159 	struct snd_dbuf *pcm_buf;
160 	const struct usb_config *usb_cfg;
161 	struct mtx *pcm_mtx;		/* lock protecting this structure */
162 	struct uaudio_softc *priv_sc;
163 	struct pcm_channel *pcm_ch;
164 	struct usb_xfer *xfer[UAUDIO_NCHANBUFS];
165 	const struct usb_audio_streaming_interface_descriptor *p_asid;
166 	const struct usb_audio_streaming_type1_descriptor *p_asf1d;
167 	const struct usb_audio_streaming_endpoint_descriptor *p_sed;
168 	const usb_endpoint_descriptor_audio_t *p_ed1;
169 	const usb_endpoint_descriptor_audio_t *p_ed2;
170 	const struct uaudio_format *p_fmt;
171 
172 	uint8_t *buf;			/* pointer to buffer */
173 	uint8_t *start;			/* upper layer buffer start */
174 	uint8_t *end;			/* upper layer buffer end */
175 	uint8_t *cur;			/* current position in upper layer
176 					 * buffer */
177 
178 	uint32_t intr_size;		/* in bytes */
179 	uint32_t intr_frames;		/* in units */
180 	uint32_t sample_rate;
181 	uint32_t frames_per_second;
182 	uint32_t sample_rem;
183 	uint32_t sample_curr;
184 
185 	uint32_t format;
186 	uint32_t pcm_format[2];
187 
188 	uint16_t bytes_per_frame[2];
189 
190 	uint16_t sample_size;
191 
192 	uint8_t	valid;
193 	uint8_t	iface_index;
194 	uint8_t	iface_alt_index;
195 };
196 
197 #define	UMIDI_CABLES_MAX   16		/* units */
198 #define	UMIDI_TX_FRAMES	   256		/* units */
199 #define	UMIDI_TX_BUFFER    (UMIDI_TX_FRAMES * 4)	/* bytes */
200 
201 enum {
202 	UMIDI_TX_TRANSFER,
203 	UMIDI_RX_TRANSFER,
204 	UMIDI_N_TRANSFER,
205 };
206 
207 struct umidi_sub_chan {
208 	struct usb_fifo_sc fifo;
209 	uint8_t *temp_cmd;
210 	uint8_t	temp_0[4];
211 	uint8_t	temp_1[4];
212 	uint8_t	state;
213 #define	UMIDI_ST_UNKNOWN   0		/* scan for command */
214 #define	UMIDI_ST_1PARAM    1
215 #define	UMIDI_ST_2PARAM_1  2
216 #define	UMIDI_ST_2PARAM_2  3
217 #define	UMIDI_ST_SYSEX_0   4
218 #define	UMIDI_ST_SYSEX_1   5
219 #define	UMIDI_ST_SYSEX_2   6
220 
221 	uint8_t	read_open:1;
222 	uint8_t	write_open:1;
223 	uint8_t	unused:6;
224 };
225 
226 struct umidi_chan {
227 
228 	struct umidi_sub_chan sub[UMIDI_CABLES_MAX];
229 	struct mtx mtx;
230 
231 	struct usb_xfer *xfer[UMIDI_N_TRANSFER];
232 
233 	uint8_t	iface_index;
234 	uint8_t	iface_alt_index;
235 
236 	uint8_t	read_open_refcount;
237 	uint8_t	write_open_refcount;
238 
239 	uint8_t	curr_cable;
240 	uint8_t	max_cable;
241 	uint8_t	valid;
242 	uint8_t single_command;
243 };
244 
245 struct uaudio_softc {
246 	struct sbuf sc_sndstat;
247 	struct sndcard_func sc_sndcard_func;
248 	struct uaudio_chan sc_rec_chan;
249 	struct uaudio_chan sc_play_chan;
250 	struct umidi_chan sc_midi_chan;
251 
252 	struct usb_device *sc_udev;
253 	struct usb_xfer *sc_mixer_xfer[1];
254 	struct uaudio_mixer_node *sc_mixer_root;
255 	struct uaudio_mixer_node *sc_mixer_curr;
256 
257 	uint32_t sc_mix_info;
258 	uint32_t sc_recsrc_info;
259 
260 	uint16_t sc_audio_rev;
261 	uint16_t sc_mixer_count;
262 
263 	uint8_t	sc_sndstat_valid;
264 	uint8_t	sc_mixer_iface_index;
265 	uint8_t	sc_mixer_iface_no;
266 	uint8_t	sc_mixer_chan;
267 	uint8_t	sc_pcm_registered:1;
268 	uint8_t	sc_mixer_init:1;
269 	uint8_t	sc_uq_audio_swap_lr:1;
270 	uint8_t	sc_uq_au_inp_async:1;
271 	uint8_t	sc_uq_au_no_xu:1;
272 	uint8_t	sc_uq_bad_adc:1;
273 	uint8_t	sc_uq_au_vendor_class:1;
274 };
275 
276 struct uaudio_search_result {
277 	uint8_t	bit_input[(256 + 7) / 8];
278 	uint8_t	bit_output[(256 + 7) / 8];
279 	uint8_t	bit_visited[(256 + 7) / 8];
280 	uint8_t	recurse_level;
281 	uint8_t	id_max;
282 };
283 
284 struct uaudio_terminal_node {
285 	union {
286 		const struct usb_descriptor *desc;
287 		const struct usb_audio_input_terminal *it;
288 		const struct usb_audio_output_terminal *ot;
289 		const struct usb_audio_mixer_unit_0 *mu;
290 		const struct usb_audio_selector_unit *su;
291 		const struct usb_audio_feature_unit *fu;
292 		const struct usb_audio_processing_unit_0 *pu;
293 		const struct usb_audio_extension_unit_0 *eu;
294 	}	u;
295 	struct uaudio_search_result usr;
296 	struct uaudio_terminal_node *root;
297 };
298 
299 struct uaudio_format {
300 	uint16_t wFormat;
301 	uint8_t	bPrecision;
302 	uint32_t freebsd_fmt;
303 	const char *description;
304 };
305 
306 static const struct uaudio_format uaudio_formats[] = {
307 
308 	{UA_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"},
309 	{UA_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"},
310 	{UA_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"},
311 	{UA_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"},
312 
313 	{UA_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"},
314 	{UA_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"},
315 	{UA_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"},
316 	{UA_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"},
317 
318 	{UA_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"},
319 	{UA_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"},
320 
321 	{0, 0, 0, NULL}
322 };
323 
324 #define	UAC_OUTPUT	0
325 #define	UAC_INPUT	1
326 #define	UAC_EQUAL	2
327 #define	UAC_RECORD	3
328 #define	UAC_NCLASSES	4
329 
330 #ifdef USB_DEBUG
331 static const char *uac_names[] = {
332 	"outputs", "inputs", "equalization", "record"
333 };
334 
335 #endif
336 
337 /* prototypes */
338 
339 static device_probe_t uaudio_probe;
340 static device_attach_t uaudio_attach;
341 static device_detach_t uaudio_detach;
342 
343 static usb_callback_t uaudio_chan_play_callback;
344 static usb_callback_t uaudio_chan_record_callback;
345 static usb_callback_t uaudio_mixer_write_cfg_callback;
346 static usb_callback_t umidi_bulk_read_callback;
347 static usb_callback_t umidi_bulk_write_callback;
348 
349 static void	uaudio_chan_fill_info_sub(struct uaudio_softc *,
350 		    struct usb_device *, uint32_t, uint8_t, uint8_t);
351 static void	uaudio_chan_fill_info(struct uaudio_softc *,
352 		    struct usb_device *);
353 static void	uaudio_mixer_add_ctl_sub(struct uaudio_softc *,
354 		    struct uaudio_mixer_node *);
355 static void	uaudio_mixer_add_ctl(struct uaudio_softc *,
356 		    struct uaudio_mixer_node *);
357 static void	uaudio_mixer_add_input(struct uaudio_softc *,
358 		    const struct uaudio_terminal_node *, int);
359 static void	uaudio_mixer_add_output(struct uaudio_softc *,
360 		    const struct uaudio_terminal_node *, int);
361 static void	uaudio_mixer_add_mixer(struct uaudio_softc *,
362 		    const struct uaudio_terminal_node *, int);
363 static void	uaudio_mixer_add_selector(struct uaudio_softc *,
364 		    const struct uaudio_terminal_node *, int);
365 static uint32_t	uaudio_mixer_feature_get_bmaControls(
366 		    const struct usb_audio_feature_unit *, uint8_t);
367 static void	uaudio_mixer_add_feature(struct uaudio_softc *,
368 		    const struct uaudio_terminal_node *, int);
369 static void	uaudio_mixer_add_processing_updown(struct uaudio_softc *,
370 		    const struct uaudio_terminal_node *, int);
371 static void	uaudio_mixer_add_processing(struct uaudio_softc *,
372 		    const struct uaudio_terminal_node *, int);
373 static void	uaudio_mixer_add_extension(struct uaudio_softc *,
374 		    const struct uaudio_terminal_node *, int);
375 static struct	usb_audio_cluster uaudio_mixer_get_cluster(uint8_t,
376 		    const struct uaudio_terminal_node *);
377 static uint16_t	uaudio_mixer_determine_class(const struct uaudio_terminal_node *,
378 		    struct uaudio_mixer_node *);
379 static uint16_t	uaudio_mixer_feature_name(const struct uaudio_terminal_node *,
380 		    struct uaudio_mixer_node *);
381 static const struct uaudio_terminal_node *uaudio_mixer_get_input(
382 		    const struct uaudio_terminal_node *, uint8_t);
383 static const struct uaudio_terminal_node *uaudio_mixer_get_output(
384 		    const struct uaudio_terminal_node *, uint8_t);
385 static void	uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *,
386 		    const uint8_t *, uint8_t, struct uaudio_search_result *);
387 static void	uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *,
388 		    uint8_t, uint8_t, struct uaudio_search_result *);
389 static void	uaudio_mixer_fill_info(struct uaudio_softc *,
390 		    struct usb_device *, void *);
391 static uint16_t	uaudio_mixer_get(struct usb_device *, uint8_t,
392 		    struct uaudio_mixer_node *);
393 static void	uaudio_mixer_ctl_set(struct uaudio_softc *,
394 		    struct uaudio_mixer_node *, uint8_t, int32_t val);
395 static usb_error_t uaudio_set_speed(struct usb_device *, uint8_t, uint32_t);
396 static int	uaudio_mixer_signext(uint8_t, int);
397 static int	uaudio_mixer_bsd2value(struct uaudio_mixer_node *, int32_t val);
398 static const void *uaudio_mixer_verify_desc(const void *, uint32_t);
399 static void	uaudio_mixer_init(struct uaudio_softc *);
400 static uint8_t	umidi_convert_to_usb(struct umidi_sub_chan *, uint8_t, uint8_t);
401 static struct	umidi_sub_chan *umidi_sub_by_fifo(struct usb_fifo *);
402 static void	umidi_start_read(struct usb_fifo *);
403 static void	umidi_stop_read(struct usb_fifo *);
404 static void	umidi_start_write(struct usb_fifo *);
405 static void	umidi_stop_write(struct usb_fifo *);
406 static int	umidi_open(struct usb_fifo *, int);
407 static int	umidi_ioctl(struct usb_fifo *, u_long cmd, void *, int);
408 static void	umidi_close(struct usb_fifo *, int);
409 static void	umidi_init(device_t dev);
410 static int	umidi_probe(device_t dev);
411 static int	umidi_detach(device_t dev);
412 
413 #ifdef USB_DEBUG
414 static void	uaudio_chan_dump_ep_desc(
415 		    const usb_endpoint_descriptor_audio_t *);
416 static void	uaudio_mixer_dump_cluster(uint8_t,
417 		    const struct uaudio_terminal_node *);
418 static const char *uaudio_mixer_get_terminal_name(uint16_t);
419 #endif
420 
421 static const struct usb_config
422 	uaudio_cfg_record[UAUDIO_NCHANBUFS] = {
423 	[0] = {
424 		.type = UE_ISOCHRONOUS,
425 		.endpoint = UE_ADDR_ANY,
426 		.direction = UE_DIR_IN,
427 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
428 		.frames = UAUDIO_NFRAMES,
429 		.flags = {.short_xfer_ok = 1,},
430 		.callback = &uaudio_chan_record_callback,
431 	},
432 
433 	[1] = {
434 		.type = UE_ISOCHRONOUS,
435 		.endpoint = UE_ADDR_ANY,
436 		.direction = UE_DIR_IN,
437 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
438 		.frames = UAUDIO_NFRAMES,
439 		.flags = {.short_xfer_ok = 1,},
440 		.callback = &uaudio_chan_record_callback,
441 	},
442 };
443 
444 static const struct usb_config
445 	uaudio_cfg_play[UAUDIO_NCHANBUFS] = {
446 	[0] = {
447 		.type = UE_ISOCHRONOUS,
448 		.endpoint = UE_ADDR_ANY,
449 		.direction = UE_DIR_OUT,
450 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
451 		.frames = UAUDIO_NFRAMES,
452 		.flags = {.short_xfer_ok = 1,},
453 		.callback = &uaudio_chan_play_callback,
454 	},
455 
456 	[1] = {
457 		.type = UE_ISOCHRONOUS,
458 		.endpoint = UE_ADDR_ANY,
459 		.direction = UE_DIR_OUT,
460 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
461 		.frames = UAUDIO_NFRAMES,
462 		.flags = {.short_xfer_ok = 1,},
463 		.callback = &uaudio_chan_play_callback,
464 	},
465 };
466 
467 static const struct usb_config
468 	uaudio_mixer_config[1] = {
469 	[0] = {
470 		.type = UE_CONTROL,
471 		.endpoint = 0x00,	/* Control pipe */
472 		.direction = UE_DIR_ANY,
473 		.bufsize = (sizeof(struct usb_device_request) + 4),
474 		.callback = &uaudio_mixer_write_cfg_callback,
475 		.timeout = 1000,	/* 1 second */
476 	},
477 };
478 
479 static const
480 uint8_t	umidi_cmd_to_len[16] = {
481 	[0x0] = 0,			/* reserved */
482 	[0x1] = 0,			/* reserved */
483 	[0x2] = 2,			/* bytes */
484 	[0x3] = 3,			/* bytes */
485 	[0x4] = 3,			/* bytes */
486 	[0x5] = 1,			/* bytes */
487 	[0x6] = 2,			/* bytes */
488 	[0x7] = 3,			/* bytes */
489 	[0x8] = 3,			/* bytes */
490 	[0x9] = 3,			/* bytes */
491 	[0xA] = 3,			/* bytes */
492 	[0xB] = 3,			/* bytes */
493 	[0xC] = 2,			/* bytes */
494 	[0xD] = 2,			/* bytes */
495 	[0xE] = 3,			/* bytes */
496 	[0xF] = 1,			/* bytes */
497 };
498 
499 static const struct usb_config
500 	umidi_config[UMIDI_N_TRANSFER] = {
501 	[UMIDI_TX_TRANSFER] = {
502 		.type = UE_BULK,
503 		.endpoint = UE_ADDR_ANY,
504 		.direction = UE_DIR_OUT,
505 		.bufsize = UMIDI_TX_BUFFER,
506 		.callback = &umidi_bulk_write_callback,
507 	},
508 
509 	[UMIDI_RX_TRANSFER] = {
510 		.type = UE_BULK,
511 		.endpoint = UE_ADDR_ANY,
512 		.direction = UE_DIR_IN,
513 		.bufsize = 4,	/* bytes */
514 		.flags = {.short_xfer_ok = 1,.proxy_buffer = 1,},
515 		.callback = &umidi_bulk_read_callback,
516 	},
517 };
518 
519 static devclass_t uaudio_devclass;
520 
521 static device_method_t uaudio_methods[] = {
522 	DEVMETHOD(device_probe, uaudio_probe),
523 	DEVMETHOD(device_attach, uaudio_attach),
524 	DEVMETHOD(device_detach, uaudio_detach),
525 	DEVMETHOD(device_suspend, bus_generic_suspend),
526 	DEVMETHOD(device_resume, bus_generic_resume),
527 	DEVMETHOD(device_shutdown, bus_generic_shutdown),
528 
529 	DEVMETHOD_END
530 };
531 
532 static driver_t uaudio_driver = {
533 	.name = "uaudio",
534 	.methods = uaudio_methods,
535 	.size = sizeof(struct uaudio_softc),
536 };
537 
538 static const STRUCT_USB_HOST_ID __used uaudio_devs[] = {
539 	/* Generic USB audio class match */
540 	{USB_IFACE_CLASS(UICLASS_AUDIO),
541 	 USB_IFACE_SUBCLASS(UISUBCLASS_AUDIOCONTROL),},
542 	/* Generic USB MIDI class match */
543 	{USB_IFACE_CLASS(UICLASS_AUDIO),
544 	 USB_IFACE_SUBCLASS(UISUBCLASS_MIDISTREAM),},
545 };
546 
547 static int
548 uaudio_probe(device_t dev)
549 {
550 	struct usb_attach_arg *uaa = device_get_ivars(dev);
551 
552 	if (uaa->usb_mode != USB_MODE_HOST)
553 		return (ENXIO);
554 
555 	/* lookup non-standard device */
556 
557 	if (uaa->info.bInterfaceClass != UICLASS_AUDIO) {
558 		if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS) == 0)
559 			return (ENXIO);
560 	}
561 
562 	/* check for AUDIO control interface */
563 
564 	if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) {
565 		if (usb_test_quirk(uaa, UQ_BAD_AUDIO))
566 			return (ENXIO);
567 		else
568 			return (BUS_PROBE_GENERIC);
569 	}
570 
571 	/* check for MIDI stream */
572 
573 	if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM) {
574 		if (usb_test_quirk(uaa, UQ_BAD_MIDI))
575 			return (ENXIO);
576 		else
577 			return (BUS_PROBE_GENERIC);
578 	}
579 	return (ENXIO);
580 }
581 
582 static int
583 uaudio_attach(device_t dev)
584 {
585 	struct usb_attach_arg *uaa = device_get_ivars(dev);
586 	struct uaudio_softc *sc = device_get_softc(dev);
587 	struct usb_interface_descriptor *id;
588 	device_t child;
589 
590 	sc->sc_play_chan.priv_sc = sc;
591 	sc->sc_rec_chan.priv_sc = sc;
592 	sc->sc_udev = uaa->device;
593 	sc->sc_mixer_iface_index = uaa->info.bIfaceIndex;
594 	sc->sc_mixer_iface_no = uaa->info.bIfaceNum;
595 
596 	if (usb_test_quirk(uaa, UQ_AUDIO_SWAP_LR))
597 		sc->sc_uq_audio_swap_lr = 1;
598 
599 	if (usb_test_quirk(uaa, UQ_AU_INP_ASYNC))
600 		sc->sc_uq_au_inp_async = 1;
601 
602 	if (usb_test_quirk(uaa, UQ_AU_NO_XU))
603 		sc->sc_uq_au_no_xu = 1;
604 
605 	if (usb_test_quirk(uaa, UQ_BAD_ADC))
606 		sc->sc_uq_bad_adc = 1;
607 
608 	if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS))
609 		sc->sc_uq_au_vendor_class = 1;
610 
611 	umidi_init(dev);
612 
613 	device_set_usb_desc(dev);
614 
615 	id = usbd_get_interface_descriptor(uaa->iface);
616 
617 	uaudio_chan_fill_info(sc, uaa->device);
618 
619 	uaudio_mixer_fill_info(sc, uaa->device, id);
620 
621 	DPRINTF("audio rev %d.%02x\n",
622 	    sc->sc_audio_rev >> 8,
623 	    sc->sc_audio_rev & 0xff);
624 
625 	DPRINTF("%d mixer controls\n",
626 	    sc->sc_mixer_count);
627 
628 	if (sc->sc_play_chan.valid) {
629 		device_printf(dev, "Play: %d Hz, %d ch, %s format.\n",
630 		    sc->sc_play_chan.sample_rate,
631 		    sc->sc_play_chan.p_asf1d->bNrChannels,
632 		    sc->sc_play_chan.p_fmt->description);
633 	} else {
634 		device_printf(dev, "No playback.\n");
635 	}
636 
637 	if (sc->sc_rec_chan.valid) {
638 		device_printf(dev, "Record: %d Hz, %d ch, %s format.\n",
639 		    sc->sc_rec_chan.sample_rate,
640 		    sc->sc_rec_chan.p_asf1d->bNrChannels,
641 		    sc->sc_rec_chan.p_fmt->description);
642 	} else {
643 		device_printf(dev, "No recording.\n");
644 	}
645 
646 	if (sc->sc_midi_chan.valid) {
647 
648 		if (umidi_probe(dev)) {
649 			goto detach;
650 		}
651 		device_printf(dev, "MIDI sequencer.\n");
652 	} else {
653 		device_printf(dev, "No midi sequencer.\n");
654 	}
655 
656 	DPRINTF("doing child attach\n");
657 
658 	/* attach the children */
659 
660 	sc->sc_sndcard_func.func = SCF_PCM;
661 
662 	/*
663 	 * Only attach a PCM device if we have a playback, recording
664 	 * or mixer device present:
665 	 */
666 	if (sc->sc_play_chan.valid ||
667 	    sc->sc_rec_chan.valid ||
668 	    sc->sc_mix_info) {
669 		child = device_add_child(dev, "pcm", -1);
670 
671 		if (child == NULL) {
672 			DPRINTF("out of memory\n");
673 			goto detach;
674 		}
675 		device_set_ivars(child, &sc->sc_sndcard_func);
676 	}
677 
678 	if (bus_generic_attach(dev)) {
679 		DPRINTF("child attach failed\n");
680 		goto detach;
681 	}
682 	return (0);			/* success */
683 
684 detach:
685 	uaudio_detach(dev);
686 	return (ENXIO);
687 }
688 
689 static void
690 uaudio_pcm_setflags(device_t dev, uint32_t flags)
691 {
692 	pcm_setflags(dev, pcm_getflags(dev) | flags);
693 }
694 
695 int
696 uaudio_attach_sub(device_t dev, kobj_class_t mixer_class, kobj_class_t chan_class)
697 {
698 	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
699 	char status[SND_STATUSLEN];
700 
701 	uaudio_mixer_init(sc);
702 
703 	if (sc->sc_uq_audio_swap_lr) {
704 		DPRINTF("hardware has swapped left and right\n");
705 		/* uaudio_pcm_setflags(dev, SD_F_PSWAPLR); */
706 	}
707 	if (!(sc->sc_mix_info & SOUND_MASK_PCM)) {
708 
709 		DPRINTF("emulating master volume\n");
710 
711 		/*
712 		 * Emulate missing pcm mixer controller
713 		 * through FEEDER_VOLUME
714 		 */
715 		uaudio_pcm_setflags(dev, SD_F_SOFTPCMVOL);
716 	}
717 	if (mixer_init(dev, mixer_class, sc)) {
718 		goto detach;
719 	}
720 	sc->sc_mixer_init = 1;
721 
722 	snprintf(status, sizeof(status), "at ? %s", PCM_KLDSTRING(snd_uaudio));
723 
724 	if (pcm_register(dev, sc,
725 	    sc->sc_play_chan.valid ? 1 : 0,
726 	    sc->sc_rec_chan.valid ? 1 : 0)) {
727 		goto detach;
728 	}
729 
730 	uaudio_pcm_setflags(dev, SD_F_MPSAFE);
731 	sc->sc_pcm_registered = 1;
732 
733 	if (sc->sc_play_chan.valid) {
734 		pcm_addchan(dev, PCMDIR_PLAY, chan_class, sc);
735 	}
736 	if (sc->sc_rec_chan.valid) {
737 		pcm_addchan(dev, PCMDIR_REC, chan_class, sc);
738 	}
739 	pcm_setstatus(dev, status);
740 
741 	return (0);			/* success */
742 
743 detach:
744 	uaudio_detach_sub(dev);
745 	return (ENXIO);
746 }
747 
748 int
749 uaudio_detach_sub(device_t dev)
750 {
751 	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
752 	int error = 0;
753 
754 repeat:
755 	if (sc->sc_pcm_registered) {
756 		error = pcm_unregister(dev);
757 	} else {
758 		if (sc->sc_mixer_init) {
759 			error = mixer_uninit(dev);
760 		}
761 	}
762 
763 	if (error) {
764 		device_printf(dev, "Waiting for sound application to exit!\n");
765 		usb_pause_mtx(NULL, 2 * hz);
766 		goto repeat;		/* try again */
767 	}
768 	return (0);			/* success */
769 }
770 
771 static int
772 uaudio_detach(device_t dev)
773 {
774 	struct uaudio_softc *sc = device_get_softc(dev);
775 
776 	/*
777 	 * Stop USB transfers early so that any audio applications
778 	 * will time out and close opened /dev/dspX.Y device(s), if
779 	 * any.
780 	 */
781 	if (sc->sc_play_chan.valid)
782 		usbd_transfer_unsetup(sc->sc_play_chan.xfer, UAUDIO_NCHANBUFS);
783 	if (sc->sc_rec_chan.valid)
784 		usbd_transfer_unsetup(sc->sc_rec_chan.xfer, UAUDIO_NCHANBUFS);
785 
786 	if (bus_generic_detach(dev) != 0) {
787 		DPRINTF("detach failed!\n");
788 	}
789 	sbuf_delete(&sc->sc_sndstat);
790 	sc->sc_sndstat_valid = 0;
791 
792 	umidi_detach(dev);
793 
794 	return (0);
795 }
796 
797 /*========================================================================*
798  * AS - Audio Stream - routines
799  *========================================================================*/
800 
801 #ifdef USB_DEBUG
802 static void
803 uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed)
804 {
805 	if (ed) {
806 		DPRINTF("endpoint=%p bLength=%d bDescriptorType=%d \n"
807 		    "bEndpointAddress=%d bmAttributes=0x%x \n"
808 		    "wMaxPacketSize=%d bInterval=%d \n"
809 		    "bRefresh=%d bSynchAddress=%d\n",
810 		    ed, ed->bLength, ed->bDescriptorType,
811 		    ed->bEndpointAddress, ed->bmAttributes,
812 		    UGETW(ed->wMaxPacketSize), ed->bInterval,
813 		    UEP_HAS_REFRESH(ed) ? ed->bRefresh : 0,
814 		    UEP_HAS_SYNCADDR(ed) ? ed->bSynchAddress : 0);
815 	}
816 }
817 
818 #endif
819 
820 /*
821  * The following is a workaround for broken no-name USB audio devices
822  * sold by dealextreme called "3D sound". The problem is that the
823  * manufacturer computed wMaxPacketSize is too small to hold the
824  * actual data sent. In other words the device sometimes sends more
825  * data than it actually reports it can send in a single isochronous
826  * packet.
827  */
828 static void
829 uaudio_record_fix_fs(usb_endpoint_descriptor_audio_t *ep,
830     uint32_t xps, uint32_t add)
831 {
832 	uint32_t mps;
833 
834 	mps = UGETW(ep->wMaxPacketSize);
835 
836 	/*
837 	 * If the device indicates it can send more data than what the
838 	 * sample rate indicates, we apply the workaround.
839 	 */
840 	if (mps > xps) {
841 
842 		/* allow additional data */
843 		xps += add;
844 
845 		/* check against the maximum USB 1.x length */
846 		if (xps > 1023)
847 			xps = 1023;
848 
849 		/* check if we should do an update */
850 		if (mps < xps) {
851 			/* simply update the wMaxPacketSize field */
852 			USETW(ep->wMaxPacketSize, xps);
853 			DPRINTF("Workaround: Updated wMaxPacketSize "
854 			    "from %d to %d bytes.\n",
855 			    (int)mps, (int)xps);
856 		}
857 	}
858 }
859 
860 static void
861 uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
862     uint32_t rate, uint8_t channels, uint8_t bit_resolution)
863 {
864 	struct usb_descriptor *desc = NULL;
865 	const struct usb_audio_streaming_interface_descriptor *asid = NULL;
866 	const struct usb_audio_streaming_type1_descriptor *asf1d = NULL;
867 	const struct usb_audio_streaming_endpoint_descriptor *sed = NULL;
868 	usb_endpoint_descriptor_audio_t *ed1 = NULL;
869 	const usb_endpoint_descriptor_audio_t *ed2 = NULL;
870 	struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
871 	struct usb_interface_descriptor *id;
872 	const struct uaudio_format *p_fmt;
873 	struct uaudio_chan *chan;
874 	uint16_t curidx = 0xFFFF;
875 	uint16_t lastidx = 0xFFFF;
876 	uint16_t alt_index = 0;
877 	uint16_t wFormat;
878 	uint8_t ep_dir;
879 	uint8_t bChannels;
880 	uint8_t bBitResolution;
881 	uint8_t x;
882 	uint8_t audio_if = 0;
883 	uint8_t uma_if_class;
884 
885 	while ((desc = usb_desc_foreach(cd, desc))) {
886 
887 		if ((desc->bDescriptorType == UDESC_INTERFACE) &&
888 		    (desc->bLength >= sizeof(*id))) {
889 
890 			id = (void *)desc;
891 
892 			if (id->bInterfaceNumber != lastidx) {
893 				lastidx = id->bInterfaceNumber;
894 				curidx++;
895 				alt_index = 0;
896 
897 			} else {
898 				alt_index++;
899 			}
900 
901 			uma_if_class =
902 			    ((id->bInterfaceClass == UICLASS_AUDIO) ||
903 			    ((id->bInterfaceClass == UICLASS_VENDOR) &&
904 			    (sc->sc_uq_au_vendor_class != 0)));
905 
906 			if ((uma_if_class != 0) && (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
907 				audio_if = 1;
908 			} else {
909 				audio_if = 0;
910 			}
911 
912 			if ((uma_if_class != 0) &&
913 			    (id->bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
914 
915 				/*
916 				 * XXX could allow multiple MIDI interfaces
917 				 */
918 
919 				if ((sc->sc_midi_chan.valid == 0) &&
920 				    usbd_get_iface(udev, curidx)) {
921 					sc->sc_midi_chan.iface_index = curidx;
922 					sc->sc_midi_chan.iface_alt_index = alt_index;
923 					sc->sc_midi_chan.valid = 1;
924 				}
925 			}
926 			asid = NULL;
927 			asf1d = NULL;
928 			ed1 = NULL;
929 			ed2 = NULL;
930 			sed = NULL;
931 		}
932 		if ((desc->bDescriptorType == UDESC_CS_INTERFACE) &&
933 		    (desc->bDescriptorSubtype == AS_GENERAL) &&
934 		    (desc->bLength >= sizeof(*asid))) {
935 			if (asid == NULL) {
936 				asid = (void *)desc;
937 			}
938 		}
939 		if ((desc->bDescriptorType == UDESC_CS_INTERFACE) &&
940 		    (desc->bDescriptorSubtype == FORMAT_TYPE) &&
941 		    (desc->bLength >= sizeof(*asf1d))) {
942 			if (asf1d == NULL) {
943 				asf1d = (void *)desc;
944 				if (asf1d->bFormatType != FORMAT_TYPE_I) {
945 					DPRINTFN(11, "ignored bFormatType = %d\n",
946 					    asf1d->bFormatType);
947 					asf1d = NULL;
948 					continue;
949 				}
950 				if (asf1d->bLength < (sizeof(*asf1d) +
951 				    ((asf1d->bSamFreqType == 0) ? 6 :
952 				    (asf1d->bSamFreqType * 3)))) {
953 					DPRINTFN(11, "'asf1d' descriptor is too short\n");
954 					asf1d = NULL;
955 					continue;
956 				}
957 			}
958 		}
959 		if ((desc->bDescriptorType == UDESC_ENDPOINT) &&
960 		    (desc->bLength >= UEP_MINSIZE)) {
961 			if (ed1 == NULL) {
962 				ed1 = (void *)desc;
963 				if (UE_GET_XFERTYPE(ed1->bmAttributes) != UE_ISOCHRONOUS) {
964 					ed1 = NULL;
965 				}
966 			}
967 		}
968 		if ((desc->bDescriptorType == UDESC_CS_ENDPOINT) &&
969 		    (desc->bDescriptorSubtype == AS_GENERAL) &&
970 		    (desc->bLength >= sizeof(*sed))) {
971 			if (sed == NULL) {
972 				sed = (void *)desc;
973 			}
974 		}
975 		if (audio_if && asid && asf1d && ed1 && sed) {
976 
977 			ep_dir = UE_GET_DIR(ed1->bEndpointAddress);
978 
979 			/* We ignore sync endpoint information until further. */
980 
981 			wFormat = UGETW(asid->wFormatTag);
982 			bChannels = UAUDIO_MAX_CHAN(asf1d->bNrChannels);
983 			bBitResolution = asf1d->bBitResolution;
984 
985 			if (asf1d->bSamFreqType == 0) {
986 				DPRINTFN(16, "Sample rate: %d-%dHz\n",
987 				    UA_SAMP_LO(asf1d), UA_SAMP_HI(asf1d));
988 
989 				if ((rate >= UA_SAMP_LO(asf1d)) &&
990 				    (rate <= UA_SAMP_HI(asf1d))) {
991 					goto found_rate;
992 				}
993 			} else {
994 
995 				for (x = 0; x < asf1d->bSamFreqType; x++) {
996 					DPRINTFN(16, "Sample rate = %dHz\n",
997 					    UA_GETSAMP(asf1d, x));
998 
999 					if (rate == UA_GETSAMP(asf1d, x)) {
1000 						goto found_rate;
1001 					}
1002 				}
1003 			}
1004 
1005 			audio_if = 0;
1006 			continue;
1007 
1008 	found_rate:
1009 
1010 			for (p_fmt = uaudio_formats;
1011 			    p_fmt->wFormat;
1012 			    p_fmt++) {
1013 				if ((p_fmt->wFormat == wFormat) &&
1014 				    (p_fmt->bPrecision == bBitResolution)) {
1015 					goto found_format;
1016 				}
1017 			}
1018 
1019 			audio_if = 0;
1020 			continue;
1021 
1022 	found_format:
1023 
1024 			if ((bChannels == channels) &&
1025 			    (bBitResolution == bit_resolution)) {
1026 
1027 				chan = (ep_dir == UE_DIR_IN) ?
1028 				    &sc->sc_rec_chan :
1029 				    &sc->sc_play_chan;
1030 
1031 				if ((chan->valid == 0) && usbd_get_iface(udev, curidx)) {
1032 
1033 					chan->valid = 1;
1034 #ifdef USB_DEBUG
1035 					uaudio_chan_dump_ep_desc(ed1);
1036 					uaudio_chan_dump_ep_desc(ed2);
1037 
1038 					if (sed->bmAttributes & UA_SED_FREQ_CONTROL) {
1039 						DPRINTFN(2, "FREQ_CONTROL\n");
1040 					}
1041 					if (sed->bmAttributes & UA_SED_PITCH_CONTROL) {
1042 						DPRINTFN(2, "PITCH_CONTROL\n");
1043 					}
1044 #endif
1045 					DPRINTF("Sample rate = %dHz, channels = %d, "
1046 					    "bits = %d, format = %s\n", rate, channels,
1047 					    bit_resolution, p_fmt->description);
1048 
1049 					chan->sample_rate = rate;
1050 					chan->p_asid = asid;
1051 					chan->p_asf1d = asf1d;
1052 					chan->p_ed1 = ed1;
1053 					chan->p_ed2 = ed2;
1054 					chan->p_fmt = p_fmt;
1055 					chan->p_sed = sed;
1056 					chan->iface_index = curidx;
1057 					chan->iface_alt_index = alt_index;
1058 
1059 					if (ep_dir == UE_DIR_IN)
1060 						chan->usb_cfg =
1061 						    uaudio_cfg_record;
1062 					else
1063 						chan->usb_cfg =
1064 						    uaudio_cfg_play;
1065 
1066 					chan->sample_size = ((
1067 					    UAUDIO_MAX_CHAN(chan->p_asf1d->bNrChannels) *
1068 					    chan->p_asf1d->bBitResolution) / 8);
1069 
1070 					if (ep_dir == UE_DIR_IN &&
1071 					    usbd_get_speed(udev) == USB_SPEED_FULL) {
1072 						uaudio_record_fix_fs(ed1,
1073 						    chan->sample_size * (rate / 1000),
1074 						    chan->sample_size * (rate / 4000));
1075 					}
1076 
1077 					if (sc->sc_sndstat_valid) {
1078 						sbuf_printf(&sc->sc_sndstat, "\n\t"
1079 						    "mode %d.%d:(%s) %dch, %d/%dbit, %s, %dHz",
1080 						    curidx, alt_index,
1081 						    (ep_dir == UE_DIR_IN) ? "input" : "output",
1082 						    asf1d->bNrChannels, asf1d->bBitResolution,
1083 						    asf1d->bSubFrameSize * 8,
1084 						    p_fmt->description, rate);
1085 					}
1086 				}
1087 			}
1088 			audio_if = 0;
1089 			continue;
1090 		}
1091 	}
1092 }
1093 
1094 /* This structure defines all the supported rates. */
1095 
1096 static const uint32_t uaudio_rate_list[] = {
1097 	96000,
1098 	88000,
1099 	80000,
1100 	72000,
1101 	64000,
1102 	56000,
1103 	48000,
1104 	44100,
1105 	40000,
1106 	32000,
1107 	24000,
1108 	22050,
1109 	16000,
1110 	11025,
1111 	8000,
1112 	0
1113 };
1114 
1115 static void
1116 uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev)
1117 {
1118 	uint32_t rate = uaudio_default_rate;
1119 	uint8_t z;
1120 	uint8_t bits = uaudio_default_bits;
1121 	uint8_t y;
1122 	uint8_t channels = uaudio_default_channels;
1123 	uint8_t x;
1124 
1125 	bits -= (bits % 8);
1126 	if ((bits == 0) || (bits > 32)) {
1127 		/* set a valid value */
1128 		bits = 32;
1129 	}
1130 	if (channels == 0) {
1131 		switch (usbd_get_speed(udev)) {
1132 		case USB_SPEED_LOW:
1133 		case USB_SPEED_FULL:
1134 			/*
1135 			 * Due to high bandwidth usage and problems
1136 			 * with HIGH-speed split transactions we
1137 			 * disable surround setups on FULL-speed USB
1138 			 * by default
1139 			 */
1140 			channels = 2;
1141 			break;
1142 		default:
1143 			channels = 16;
1144 			break;
1145 		}
1146 	} else if (channels > 16) {
1147 		channels = 16;
1148 	}
1149 	if (sbuf_new(&sc->sc_sndstat, NULL, 4096, SBUF_AUTOEXTEND)) {
1150 		sc->sc_sndstat_valid = 1;
1151 	}
1152 	/* try to search for a valid config */
1153 
1154 	for (x = channels; x; x--) {
1155 		for (y = bits; y; y -= 8) {
1156 
1157 			/* try user defined rate, if any */
1158 			if (rate != 0)
1159 				uaudio_chan_fill_info_sub(sc, udev, rate, x, y);
1160 
1161 			/* try find a matching rate, if any */
1162 			for (z = 0; uaudio_rate_list[z]; z++) {
1163 				uaudio_chan_fill_info_sub(sc, udev, uaudio_rate_list[z], x, y);
1164 
1165 				if (sc->sc_rec_chan.valid &&
1166 				    sc->sc_play_chan.valid) {
1167 					goto done;
1168 				}
1169 			}
1170 		}
1171 	}
1172 
1173 done:
1174 	if (sc->sc_sndstat_valid) {
1175 		sbuf_finish(&sc->sc_sndstat);
1176 	}
1177 }
1178 
1179 static void
1180 uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error)
1181 {
1182 	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
1183 	struct usb_page_cache *pc;
1184 	uint32_t total;
1185 	uint32_t blockcount;
1186 	uint32_t n;
1187 	uint32_t offset;
1188 	int actlen;
1189 	int sumlen;
1190 
1191 	usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
1192 
1193 	if (ch->end == ch->start) {
1194 		DPRINTF("no buffer!\n");
1195 		return;
1196 	}
1197 
1198 	switch (USB_GET_STATE(xfer)) {
1199 	case USB_ST_TRANSFERRED:
1200 tr_transferred:
1201 		if (actlen < sumlen) {
1202 			DPRINTF("short transfer, "
1203 			    "%d of %d bytes\n", actlen, sumlen);
1204 		}
1205 		chn_intr(ch->pcm_ch);
1206 
1207 	case USB_ST_SETUP:
1208 		if (ch->bytes_per_frame[1] > usbd_xfer_max_framelen(xfer)) {
1209 			DPRINTF("bytes per transfer, %d, "
1210 			    "exceeds maximum, %d!\n",
1211 			    ch->bytes_per_frame[1],
1212 			    usbd_xfer_max_framelen(xfer));
1213 			break;
1214 		}
1215 
1216 		blockcount = ch->intr_frames;
1217 
1218 		/* setup number of frames */
1219 		usbd_xfer_set_frames(xfer, blockcount);
1220 
1221 		/* reset total length */
1222 		total = 0;
1223 
1224 		/* setup frame lengths */
1225 		for (n = 0; n != blockcount; n++) {
1226 			ch->sample_curr += ch->sample_rem;
1227 			if (ch->sample_curr >= ch->frames_per_second) {
1228 				ch->sample_curr -= ch->frames_per_second;
1229 				usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame[1]);
1230 				total += ch->bytes_per_frame[1];
1231 			} else {
1232 				usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame[0]);
1233 				total += ch->bytes_per_frame[0];
1234 			}
1235 		}
1236 
1237 		DPRINTFN(6, "transfer %d bytes\n", total);
1238 
1239 		offset = 0;
1240 
1241 		pc = usbd_xfer_get_frame(xfer, 0);
1242 		while (total > 0) {
1243 
1244 			n = (ch->end - ch->cur);
1245 			if (n > total) {
1246 				n = total;
1247 			}
1248 			usbd_copy_in(pc, offset, ch->cur, n);
1249 
1250 			total -= n;
1251 			ch->cur += n;
1252 			offset += n;
1253 
1254 			if (ch->cur >= ch->end) {
1255 				ch->cur = ch->start;
1256 			}
1257 		}
1258 
1259 		usbd_transfer_submit(xfer);
1260 		break;
1261 
1262 	default:			/* Error */
1263 		if (error == USB_ERR_CANCELLED) {
1264 			break;
1265 		}
1266 		goto tr_transferred;
1267 	}
1268 }
1269 
1270 static void
1271 uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error)
1272 {
1273 	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
1274 	struct usb_page_cache *pc;
1275 	uint32_t offset0;
1276 	uint32_t offset1;
1277 	uint32_t mfl;
1278 	int m;
1279 	int n;
1280 	int len;
1281 	int actlen;
1282 	int nframes;
1283 	int blockcount;
1284 
1285 	usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
1286 	mfl = usbd_xfer_max_framelen(xfer);
1287 
1288 	if (ch->end == ch->start) {
1289 		DPRINTF("no buffer!\n");
1290 		return;
1291 	}
1292 
1293 	switch (USB_GET_STATE(xfer)) {
1294 	case USB_ST_TRANSFERRED:
1295 
1296 		DPRINTFN(6, "transferred %d bytes\n", actlen);
1297 
1298 		offset0 = 0;
1299 		pc = usbd_xfer_get_frame(xfer, 0);
1300 
1301 		for (n = 0; n != nframes; n++) {
1302 
1303 			offset1 = offset0;
1304 			len = usbd_xfer_frame_len(xfer, n);
1305 
1306 			while (len > 0) {
1307 
1308 				m = (ch->end - ch->cur);
1309 
1310 				if (m > len)
1311 					m = len;
1312 
1313 				usbd_copy_out(pc, offset1, ch->cur, m);
1314 
1315 				len -= m;
1316 				offset1 += m;
1317 				ch->cur += m;
1318 
1319 				if (ch->cur >= ch->end) {
1320 					ch->cur = ch->start;
1321 				}
1322 			}
1323 
1324 			offset0 += mfl;
1325 		}
1326 
1327 		chn_intr(ch->pcm_ch);
1328 
1329 	case USB_ST_SETUP:
1330 tr_setup:
1331 		blockcount = ch->intr_frames;
1332 
1333 		usbd_xfer_set_frames(xfer, blockcount);
1334 		for (n = 0; n < blockcount; n++) {
1335 			usbd_xfer_set_frame_len(xfer, n, mfl);
1336 		}
1337 
1338 		usbd_transfer_submit(xfer);
1339 		break;
1340 
1341 	default:			/* Error */
1342 		if (error == USB_ERR_CANCELLED) {
1343 			break;
1344 		}
1345 		goto tr_setup;
1346 	}
1347 }
1348 
1349 void   *
1350 uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b,
1351     struct pcm_channel *c, int dir)
1352 {
1353 	struct uaudio_chan *ch = ((dir == PCMDIR_PLAY) ?
1354 	    &sc->sc_play_chan : &sc->sc_rec_chan);
1355 	uint32_t buf_size;
1356 	uint32_t frames;
1357 	uint32_t format;
1358 	uint16_t fps;
1359 	uint8_t endpoint;
1360 	uint8_t blocks;
1361 	uint8_t iface_index;
1362 	uint8_t alt_index;
1363 	uint8_t fps_shift;
1364 	usb_error_t err;
1365 
1366 	fps = usbd_get_isoc_fps(sc->sc_udev);
1367 
1368 	if (fps < 8000) {
1369 		/* FULL speed USB */
1370 		frames = 8;
1371 	} else {
1372 		/* HIGH speed USB */
1373 		frames = UAUDIO_NFRAMES;
1374 	}
1375 
1376 	/* setup play/record format */
1377 
1378 	ch->pcm_cap.fmtlist = ch->pcm_format;
1379 
1380 	ch->pcm_format[0] = 0;
1381 	ch->pcm_format[1] = 0;
1382 
1383 	ch->pcm_cap.minspeed = ch->sample_rate;
1384 	ch->pcm_cap.maxspeed = ch->sample_rate;
1385 
1386 	/* setup mutex and PCM channel */
1387 
1388 	ch->pcm_ch = c;
1389 	ch->pcm_mtx = c->lock;
1390 
1391 	format = ch->p_fmt->freebsd_fmt;
1392 
1393 	switch (ch->p_asf1d->bNrChannels) {
1394 	case 2:
1395 		/* stereo */
1396 		format = SND_FORMAT(format, 2, 0);
1397 		break;
1398 	case 1:
1399 		/* mono */
1400 		format = SND_FORMAT(format, 1, 0);
1401 		break;
1402 	default:
1403 		/* surround and more */
1404 		format = feeder_matrix_default_format(
1405 		    SND_FORMAT(format, ch->p_asf1d->bNrChannels, 0));
1406 		break;
1407 	}
1408 
1409 	ch->pcm_cap.fmtlist[0] = format;
1410 	ch->pcm_cap.fmtlist[1] = 0;
1411 
1412 	/* check if format is not supported */
1413 
1414 	if (format == 0) {
1415 		DPRINTF("The selected audio format is not supported\n");
1416 		goto error;
1417 	}
1418 
1419 	/* set alternate interface corresponding to the mode */
1420 
1421 	endpoint = ch->p_ed1->bEndpointAddress;
1422 	iface_index = ch->iface_index;
1423 	alt_index = ch->iface_alt_index;
1424 
1425 	DPRINTF("endpoint=0x%02x, speed=%d, iface=%d alt=%d\n",
1426 	    endpoint, ch->sample_rate, iface_index, alt_index);
1427 
1428 	err = usbd_set_alt_interface_index(sc->sc_udev, iface_index, alt_index);
1429 	if (err) {
1430 		DPRINTF("setting of alternate index failed: %s!\n",
1431 		    usbd_errstr(err));
1432 		goto error;
1433 	}
1434 	usbd_set_parent_iface(sc->sc_udev, iface_index,
1435 	    sc->sc_mixer_iface_index);
1436 
1437 	/*
1438 	 * Only set the sample rate if the channel reports that it
1439 	 * supports the frequency control.
1440 	 */
1441 	if (ch->p_sed->bmAttributes & UA_SED_FREQ_CONTROL) {
1442 		if (uaudio_set_speed(sc->sc_udev, endpoint, ch->sample_rate)) {
1443 			/*
1444 			 * If the endpoint is adaptive setting the speed may
1445 			 * fail.
1446 			 */
1447 			DPRINTF("setting of sample rate failed! (continuing anyway)\n");
1448 		}
1449 	}
1450 	if (usbd_transfer_setup(sc->sc_udev, &iface_index, ch->xfer,
1451 	    ch->usb_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) {
1452 		DPRINTF("could not allocate USB transfers!\n");
1453 		goto error;
1454 	}
1455 
1456 	fps_shift = usbd_xfer_get_fps_shift(ch->xfer[0]);
1457 
1458 	/* down shift number of frames per second, if any */
1459 	fps >>= fps_shift;
1460 	frames >>= fps_shift;
1461 
1462 	/* bytes per frame should not be zero */
1463 	ch->bytes_per_frame[0] = ((ch->sample_rate / fps) * ch->sample_size);
1464 	ch->bytes_per_frame[1] = (((ch->sample_rate + fps - 1) / fps) * ch->sample_size);
1465 
1466 	/* setup data rate dithering, if any */
1467 	ch->frames_per_second = fps;
1468 	ch->sample_rem = ch->sample_rate % fps;
1469 	ch->sample_curr = 0;
1470 	ch->frames_per_second = fps;
1471 
1472 	/* compute required buffer size */
1473 	buf_size = (ch->bytes_per_frame[1] * frames);
1474 
1475 	ch->intr_size = buf_size;
1476 	ch->intr_frames = frames;
1477 
1478 	DPRINTF("fps=%d sample_rem=%d\n", fps, ch->sample_rem);
1479 
1480 	if (ch->intr_frames == 0) {
1481 		DPRINTF("frame shift is too high!\n");
1482 		goto error;
1483 	}
1484 
1485 	/* setup double buffering */
1486 	buf_size *= 2;
1487 	blocks = 2;
1488 
1489 	ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO);
1490 	if (ch->buf == NULL)
1491 		goto error;
1492 	if (sndbuf_setup(b, ch->buf, buf_size) != 0)
1493 		goto error;
1494 	if (sndbuf_resize(b, blocks, ch->intr_size))
1495 		goto error;
1496 
1497 	ch->start = ch->buf;
1498 	ch->end = ch->buf + buf_size;
1499 	ch->cur = ch->buf;
1500 	ch->pcm_buf = b;
1501 
1502 	if (ch->pcm_mtx == NULL) {
1503 		DPRINTF("ERROR: PCM channels does not have a mutex!\n");
1504 		goto error;
1505 	}
1506 
1507 	return (ch);
1508 
1509 error:
1510 	uaudio_chan_free(ch);
1511 	return (NULL);
1512 }
1513 
1514 int
1515 uaudio_chan_free(struct uaudio_chan *ch)
1516 {
1517 	if (ch->buf != NULL) {
1518 		free(ch->buf, M_DEVBUF);
1519 		ch->buf = NULL;
1520 	}
1521 	usbd_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS);
1522 
1523 	ch->valid = 0;
1524 
1525 	return (0);
1526 }
1527 
1528 int
1529 uaudio_chan_set_param_blocksize(struct uaudio_chan *ch, uint32_t blocksize)
1530 {
1531 	return (ch->intr_size);
1532 }
1533 
1534 int
1535 uaudio_chan_set_param_fragments(struct uaudio_chan *ch, uint32_t blocksize,
1536     uint32_t blockcount)
1537 {
1538 	return (1);
1539 }
1540 
1541 int
1542 uaudio_chan_set_param_speed(struct uaudio_chan *ch, uint32_t speed)
1543 {
1544 	if (speed != ch->sample_rate) {
1545 		DPRINTF("rate conversion required\n");
1546 	}
1547 	return (ch->sample_rate);
1548 }
1549 
1550 int
1551 uaudio_chan_getptr(struct uaudio_chan *ch)
1552 {
1553 	return (ch->cur - ch->start);
1554 }
1555 
1556 struct pcmchan_caps *
1557 uaudio_chan_getcaps(struct uaudio_chan *ch)
1558 {
1559 	return (&ch->pcm_cap);
1560 }
1561 
1562 static struct pcmchan_matrix uaudio_chan_matrix_swap_2_0 = {
1563 	.id = SND_CHN_MATRIX_DRV,
1564 	.channels = 2,
1565 	.ext = 0,
1566 	.map = {
1567 		/* Right */
1568 		[0] = {
1569 			.type = SND_CHN_T_FR,
1570 			.members =
1571 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |
1572 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |
1573 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR
1574 		},
1575 		/* Left */
1576 		[1] = {
1577 			.type = SND_CHN_T_FL,
1578 			.members =
1579 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |
1580 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |
1581 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL
1582 		},
1583 		[2] = {
1584 			.type = SND_CHN_T_MAX,
1585 			.members = 0
1586 		}
1587 	},
1588 	.mask = SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FL,
1589 	.offset = {  1,  0, -1, -1, -1, -1, -1, -1, -1,
1590 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }
1591 };
1592 
1593 struct pcmchan_matrix *
1594 uaudio_chan_getmatrix(struct uaudio_chan *ch, uint32_t format)
1595 {
1596 	struct uaudio_softc *sc;
1597 
1598 	sc = ch->priv_sc;
1599 
1600 	if (sc != NULL && sc->sc_uq_audio_swap_lr != 0 &&
1601 	    AFMT_CHANNEL(format) == 2)
1602 		return (&uaudio_chan_matrix_swap_2_0);
1603 
1604 	return (feeder_matrix_format_map(format));
1605 }
1606 
1607 int
1608 uaudio_chan_set_param_format(struct uaudio_chan *ch, uint32_t format)
1609 {
1610 	ch->format = format;
1611 	return (0);
1612 }
1613 
1614 int
1615 uaudio_chan_start(struct uaudio_chan *ch)
1616 {
1617 	ch->cur = ch->start;
1618 
1619 #if (UAUDIO_NCHANBUFS != 2)
1620 #error "please update code"
1621 #endif
1622 	if (ch->xfer[0]) {
1623 		usbd_transfer_start(ch->xfer[0]);
1624 	}
1625 	if (ch->xfer[1]) {
1626 		usbd_transfer_start(ch->xfer[1]);
1627 	}
1628 	return (0);
1629 }
1630 
1631 int
1632 uaudio_chan_stop(struct uaudio_chan *ch)
1633 {
1634 #if (UAUDIO_NCHANBUFS != 2)
1635 #error "please update code"
1636 #endif
1637 	usbd_transfer_stop(ch->xfer[0]);
1638 	usbd_transfer_stop(ch->xfer[1]);
1639 	return (0);
1640 }
1641 
1642 /*========================================================================*
1643  * AC - Audio Controller - routines
1644  *========================================================================*/
1645 
1646 static void
1647 uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
1648 {
1649 	struct uaudio_mixer_node *p_mc_new =
1650 	    malloc(sizeof(*p_mc_new), M_USBDEV, M_WAITOK);
1651 
1652 	if (p_mc_new != NULL) {
1653 		memcpy(p_mc_new, mc, sizeof(*p_mc_new));
1654 		p_mc_new->next = sc->sc_mixer_root;
1655 		sc->sc_mixer_root = p_mc_new;
1656 		sc->sc_mixer_count++;
1657 	} else {
1658 		DPRINTF("out of memory\n");
1659 	}
1660 }
1661 
1662 static void
1663 uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
1664 {
1665 	int32_t res;
1666 
1667 	if (mc->class < UAC_NCLASSES) {
1668 		DPRINTF("adding %s.%d\n",
1669 		    uac_names[mc->class], mc->ctl);
1670 	} else {
1671 		DPRINTF("adding %d\n", mc->ctl);
1672 	}
1673 
1674 	if (mc->type == MIX_ON_OFF) {
1675 		mc->minval = 0;
1676 		mc->maxval = 1;
1677 	} else if (mc->type == MIX_SELECTOR) {
1678 	} else {
1679 
1680 		/* determine min and max values */
1681 
1682 		mc->minval = uaudio_mixer_get(sc->sc_udev, GET_MIN, mc);
1683 
1684 		mc->minval = uaudio_mixer_signext(mc->type, mc->minval);
1685 
1686 		mc->maxval = uaudio_mixer_get(sc->sc_udev, GET_MAX, mc);
1687 
1688 		mc->maxval = uaudio_mixer_signext(mc->type, mc->maxval);
1689 
1690 		/* check if max and min was swapped */
1691 
1692 		if (mc->maxval < mc->minval) {
1693 			res = mc->maxval;
1694 			mc->maxval = mc->minval;
1695 			mc->minval = res;
1696 		}
1697 
1698 		/* compute value range */
1699 		mc->mul = mc->maxval - mc->minval;
1700 		if (mc->mul == 0)
1701 			mc->mul = 1;
1702 
1703 		/* compute value alignment */
1704 		res = uaudio_mixer_get(sc->sc_udev, GET_RES, mc);
1705 
1706 		DPRINTF("Resolution = %d\n", (int)res);
1707 	}
1708 
1709 	uaudio_mixer_add_ctl_sub(sc, mc);
1710 
1711 #ifdef USB_DEBUG
1712 	if (uaudio_debug > 2) {
1713 		uint8_t i;
1714 
1715 		for (i = 0; i < mc->nchan; i++) {
1716 			DPRINTF("[mix] wValue=%04x\n", mc->wValue[0]);
1717 		}
1718 		DPRINTF("[mix] wIndex=%04x type=%d ctl='%d' "
1719 		    "min=%d max=%d\n",
1720 		    mc->wIndex, mc->type, mc->ctl,
1721 		    mc->minval, mc->maxval);
1722 	}
1723 #endif
1724 }
1725 
1726 static void
1727 uaudio_mixer_add_input(struct uaudio_softc *sc,
1728     const struct uaudio_terminal_node *iot, int id)
1729 {
1730 #ifdef USB_DEBUG
1731 	const struct usb_audio_input_terminal *d = iot[id].u.it;
1732 
1733 	DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x "
1734 	    "bAssocTerminal=%d bNrChannels=%d wChannelConfig=%d "
1735 	    "iChannelNames=%d\n",
1736 	    d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal,
1737 	    d->bNrChannels, UGETW(d->wChannelConfig),
1738 	    d->iChannelNames);
1739 #endif
1740 }
1741 
1742 static void
1743 uaudio_mixer_add_output(struct uaudio_softc *sc,
1744     const struct uaudio_terminal_node *iot, int id)
1745 {
1746 #ifdef USB_DEBUG
1747 	const struct usb_audio_output_terminal *d = iot[id].u.ot;
1748 
1749 	DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x "
1750 	    "bAssocTerminal=%d bSourceId=%d iTerminal=%d\n",
1751 	    d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal,
1752 	    d->bSourceId, d->iTerminal);
1753 #endif
1754 }
1755 
1756 static void
1757 uaudio_mixer_add_mixer(struct uaudio_softc *sc,
1758     const struct uaudio_terminal_node *iot, int id)
1759 {
1760 	struct uaudio_mixer_node mix;
1761 
1762 	const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu;
1763 	const struct usb_audio_mixer_unit_1 *d1;
1764 
1765 	uint32_t bno;			/* bit number */
1766 	uint32_t p;			/* bit number accumulator */
1767 	uint32_t mo;			/* matching outputs */
1768 	uint32_t mc;			/* matching channels */
1769 	uint32_t ichs;			/* input channels */
1770 	uint32_t ochs;			/* output channels */
1771 	uint32_t c;
1772 	uint32_t chs;			/* channels */
1773 	uint32_t i;
1774 	uint32_t o;
1775 
1776 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
1777 	    d0->bUnitId, d0->bNrInPins);
1778 
1779 	/* compute the number of input channels */
1780 
1781 	ichs = 0;
1782 	for (i = 0; i < d0->bNrInPins; i++) {
1783 		ichs += (uaudio_mixer_get_cluster(d0->baSourceId[i], iot)
1784 		    .bNrChannels);
1785 	}
1786 
1787 	d1 = (const void *)(d0->baSourceId + d0->bNrInPins);
1788 
1789 	/* and the number of output channels */
1790 
1791 	ochs = d1->bNrChannels;
1792 
1793 	DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs);
1794 
1795 	memset(&mix, 0, sizeof(mix));
1796 
1797 	mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
1798 	uaudio_mixer_determine_class(&iot[id], &mix);
1799 	mix.type = MIX_SIGNED_16;
1800 
1801 	if (uaudio_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL) {
1802 		return;
1803 	}
1804 	for (p = i = 0; i < d0->bNrInPins; i++) {
1805 		chs = uaudio_mixer_get_cluster(d0->baSourceId[i], iot).bNrChannels;
1806 		mc = 0;
1807 		for (c = 0; c < chs; c++) {
1808 			mo = 0;
1809 			for (o = 0; o < ochs; o++) {
1810 				bno = ((p + c) * ochs) + o;
1811 				if (BIT_TEST(d1->bmControls, bno)) {
1812 					mo++;
1813 				}
1814 			}
1815 			if (mo == 1) {
1816 				mc++;
1817 			}
1818 		}
1819 		if ((mc == chs) && (chs <= MIX_MAX_CHAN)) {
1820 
1821 			/* repeat bit-scan */
1822 
1823 			mc = 0;
1824 			for (c = 0; c < chs; c++) {
1825 				for (o = 0; o < ochs; o++) {
1826 					bno = ((p + c) * ochs) + o;
1827 					if (BIT_TEST(d1->bmControls, bno)) {
1828 						mix.wValue[mc++] = MAKE_WORD(p + c + 1, o + 1);
1829 					}
1830 				}
1831 			}
1832 			mix.nchan = chs;
1833 			uaudio_mixer_add_ctl(sc, &mix);
1834 		} else {
1835 			/* XXX */
1836 		}
1837 		p += chs;
1838 	}
1839 }
1840 
1841 static void
1842 uaudio_mixer_add_selector(struct uaudio_softc *sc,
1843     const struct uaudio_terminal_node *iot, int id)
1844 {
1845 	const struct usb_audio_selector_unit *d = iot[id].u.su;
1846 	struct uaudio_mixer_node mix;
1847 	uint16_t i;
1848 
1849 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
1850 	    d->bUnitId, d->bNrInPins);
1851 
1852 	if (d->bNrInPins == 0) {
1853 		return;
1854 	}
1855 	memset(&mix, 0, sizeof(mix));
1856 
1857 	mix.wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
1858 	mix.wValue[0] = MAKE_WORD(0, 0);
1859 	uaudio_mixer_determine_class(&iot[id], &mix);
1860 	mix.nchan = 1;
1861 	mix.type = MIX_SELECTOR;
1862 
1863 	mix.ctl = SOUND_MIXER_NRDEVICES;
1864 	mix.minval = 1;
1865 	mix.maxval = d->bNrInPins;
1866 
1867 	if (mix.maxval > MAX_SELECTOR_INPUT_PIN) {
1868 		mix.maxval = MAX_SELECTOR_INPUT_PIN;
1869 	}
1870 	mix.mul = (mix.maxval - mix.minval);
1871 	for (i = 0; i < MAX_SELECTOR_INPUT_PIN; i++) {
1872 		mix.slctrtype[i] = SOUND_MIXER_NRDEVICES;
1873 	}
1874 
1875 	for (i = 0; i < mix.maxval; i++) {
1876 		mix.slctrtype[i] = uaudio_mixer_feature_name
1877 		    (&iot[d->baSourceId[i]], &mix);
1878 	}
1879 
1880 	mix.class = 0;			/* not used */
1881 
1882 	uaudio_mixer_add_ctl(sc, &mix);
1883 }
1884 
1885 static uint32_t
1886 uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d,
1887     uint8_t i)
1888 {
1889 	uint32_t temp = 0;
1890 	uint32_t offset = (i * d->bControlSize);
1891 
1892 	if (d->bControlSize > 0) {
1893 		temp |= d->bmaControls[offset];
1894 		if (d->bControlSize > 1) {
1895 			temp |= d->bmaControls[offset + 1] << 8;
1896 			if (d->bControlSize > 2) {
1897 				temp |= d->bmaControls[offset + 2] << 16;
1898 				if (d->bControlSize > 3) {
1899 					temp |= d->bmaControls[offset + 3] << 24;
1900 				}
1901 			}
1902 		}
1903 	}
1904 	return (temp);
1905 }
1906 
1907 static void
1908 uaudio_mixer_add_feature(struct uaudio_softc *sc,
1909     const struct uaudio_terminal_node *iot, int id)
1910 {
1911 	const struct usb_audio_feature_unit *d = iot[id].u.fu;
1912 	struct uaudio_mixer_node mix;
1913 	uint32_t fumask;
1914 	uint32_t mmask;
1915 	uint32_t cmask;
1916 	uint16_t mixernumber;
1917 	uint8_t nchan;
1918 	uint8_t chan;
1919 	uint8_t ctl;
1920 	uint8_t i;
1921 
1922 	if (d->bControlSize == 0) {
1923 		return;
1924 	}
1925 	memset(&mix, 0, sizeof(mix));
1926 
1927 	nchan = (d->bLength - 7) / d->bControlSize;
1928 	mmask = uaudio_mixer_feature_get_bmaControls(d, 0);
1929 	cmask = 0;
1930 
1931 	if (nchan == 0) {
1932 		return;
1933 	}
1934 	/* figure out what we can control */
1935 
1936 	for (chan = 1; chan < nchan; chan++) {
1937 		DPRINTFN(10, "chan=%d mask=%x\n",
1938 		    chan, uaudio_mixer_feature_get_bmaControls(d, chan));
1939 
1940 		cmask |= uaudio_mixer_feature_get_bmaControls(d, chan);
1941 	}
1942 
1943 	if (nchan > MIX_MAX_CHAN) {
1944 		nchan = MIX_MAX_CHAN;
1945 	}
1946 	mix.wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
1947 
1948 	for (ctl = 1; ctl <= LOUDNESS_CONTROL; ctl++) {
1949 
1950 		fumask = FU_MASK(ctl);
1951 
1952 		DPRINTFN(5, "ctl=%d fumask=0x%04x\n",
1953 		    ctl, fumask);
1954 
1955 		if (mmask & fumask) {
1956 			mix.nchan = 1;
1957 			mix.wValue[0] = MAKE_WORD(ctl, 0);
1958 		} else if (cmask & fumask) {
1959 			mix.nchan = nchan - 1;
1960 			for (i = 1; i < nchan; i++) {
1961 				if (uaudio_mixer_feature_get_bmaControls(d, i) & fumask)
1962 					mix.wValue[i - 1] = MAKE_WORD(ctl, i);
1963 				else
1964 					mix.wValue[i - 1] = -1;
1965 			}
1966 		} else {
1967 			continue;
1968 		}
1969 
1970 		mixernumber = uaudio_mixer_feature_name(&iot[id], &mix);
1971 
1972 		switch (ctl) {
1973 		case MUTE_CONTROL:
1974 			mix.type = MIX_ON_OFF;
1975 			mix.ctl = SOUND_MIXER_NRDEVICES;
1976 			break;
1977 
1978 		case VOLUME_CONTROL:
1979 			mix.type = MIX_SIGNED_16;
1980 			mix.ctl = mixernumber;
1981 			break;
1982 
1983 		case BASS_CONTROL:
1984 			mix.type = MIX_SIGNED_8;
1985 			mix.ctl = SOUND_MIXER_BASS;
1986 			break;
1987 
1988 		case MID_CONTROL:
1989 			mix.type = MIX_SIGNED_8;
1990 			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
1991 			break;
1992 
1993 		case TREBLE_CONTROL:
1994 			mix.type = MIX_SIGNED_8;
1995 			mix.ctl = SOUND_MIXER_TREBLE;
1996 			break;
1997 
1998 		case GRAPHIC_EQUALIZER_CONTROL:
1999 			continue;	/* XXX don't add anything */
2000 			break;
2001 
2002 		case AGC_CONTROL:
2003 			mix.type = MIX_ON_OFF;
2004 			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
2005 			break;
2006 
2007 		case DELAY_CONTROL:
2008 			mix.type = MIX_UNSIGNED_16;
2009 			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
2010 			break;
2011 
2012 		case BASS_BOOST_CONTROL:
2013 			mix.type = MIX_ON_OFF;
2014 			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
2015 			break;
2016 
2017 		case LOUDNESS_CONTROL:
2018 			mix.type = MIX_ON_OFF;
2019 			mix.ctl = SOUND_MIXER_LOUD;	/* Is this correct ? */
2020 			break;
2021 
2022 		default:
2023 			mix.type = MIX_UNKNOWN;
2024 			break;
2025 		}
2026 
2027 		if (mix.type != MIX_UNKNOWN) {
2028 			uaudio_mixer_add_ctl(sc, &mix);
2029 		}
2030 	}
2031 }
2032 
2033 static void
2034 uaudio_mixer_add_processing_updown(struct uaudio_softc *sc,
2035     const struct uaudio_terminal_node *iot, int id)
2036 {
2037 	const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu;
2038 	const struct usb_audio_processing_unit_1 *d1 =
2039 	(const void *)(d0->baSourceId + d0->bNrInPins);
2040 	const struct usb_audio_processing_unit_updown *ud =
2041 	(const void *)(d1->bmControls + d1->bControlSize);
2042 	struct uaudio_mixer_node mix;
2043 	uint8_t i;
2044 
2045 	if (uaudio_mixer_verify_desc(d0, sizeof(*ud)) == NULL) {
2046 		return;
2047 	}
2048 	if (uaudio_mixer_verify_desc(d0, sizeof(*ud) + (2 * ud->bNrModes))
2049 	    == NULL) {
2050 		return;
2051 	}
2052 	DPRINTFN(3, "bUnitId=%d bNrModes=%d\n",
2053 	    d0->bUnitId, ud->bNrModes);
2054 
2055 	if (!(d1->bmControls[0] & UA_PROC_MASK(UD_MODE_SELECT_CONTROL))) {
2056 		DPRINTF("no mode select\n");
2057 		return;
2058 	}
2059 	memset(&mix, 0, sizeof(mix));
2060 
2061 	mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
2062 	mix.nchan = 1;
2063 	mix.wValue[0] = MAKE_WORD(UD_MODE_SELECT_CONTROL, 0);
2064 	uaudio_mixer_determine_class(&iot[id], &mix);
2065 	mix.type = MIX_ON_OFF;		/* XXX */
2066 
2067 	for (i = 0; i < ud->bNrModes; i++) {
2068 		DPRINTFN(3, "i=%d bm=0x%x\n", i, UGETW(ud->waModes[i]));
2069 		/* XXX */
2070 	}
2071 
2072 	uaudio_mixer_add_ctl(sc, &mix);
2073 }
2074 
2075 static void
2076 uaudio_mixer_add_processing(struct uaudio_softc *sc,
2077     const struct uaudio_terminal_node *iot, int id)
2078 {
2079 	const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu;
2080 	const struct usb_audio_processing_unit_1 *d1 =
2081 	(const void *)(d0->baSourceId + d0->bNrInPins);
2082 	struct uaudio_mixer_node mix;
2083 	uint16_t ptype;
2084 
2085 	memset(&mix, 0, sizeof(mix));
2086 
2087 	ptype = UGETW(d0->wProcessType);
2088 
2089 	DPRINTFN(3, "wProcessType=%d bUnitId=%d "
2090 	    "bNrInPins=%d\n", ptype, d0->bUnitId, d0->bNrInPins);
2091 
2092 	if (d1->bControlSize == 0) {
2093 		return;
2094 	}
2095 	if (d1->bmControls[0] & UA_PROC_ENABLE_MASK) {
2096 		mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
2097 		mix.nchan = 1;
2098 		mix.wValue[0] = MAKE_WORD(XX_ENABLE_CONTROL, 0);
2099 		uaudio_mixer_determine_class(&iot[id], &mix);
2100 		mix.type = MIX_ON_OFF;
2101 		uaudio_mixer_add_ctl(sc, &mix);
2102 	}
2103 	switch (ptype) {
2104 	case UPDOWNMIX_PROCESS:
2105 		uaudio_mixer_add_processing_updown(sc, iot, id);
2106 		break;
2107 
2108 	case DOLBY_PROLOGIC_PROCESS:
2109 	case P3D_STEREO_EXTENDER_PROCESS:
2110 	case REVERBATION_PROCESS:
2111 	case CHORUS_PROCESS:
2112 	case DYN_RANGE_COMP_PROCESS:
2113 	default:
2114 		DPRINTF("unit %d, type=%d is not implemented\n",
2115 		    d0->bUnitId, ptype);
2116 		break;
2117 	}
2118 }
2119 
2120 static void
2121 uaudio_mixer_add_extension(struct uaudio_softc *sc,
2122     const struct uaudio_terminal_node *iot, int id)
2123 {
2124 	const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu;
2125 	const struct usb_audio_extension_unit_1 *d1 =
2126 	(const void *)(d0->baSourceId + d0->bNrInPins);
2127 	struct uaudio_mixer_node mix;
2128 
2129 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
2130 	    d0->bUnitId, d0->bNrInPins);
2131 
2132 	if (sc->sc_uq_au_no_xu) {
2133 		return;
2134 	}
2135 	if (d1->bControlSize == 0) {
2136 		return;
2137 	}
2138 	if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) {
2139 
2140 		memset(&mix, 0, sizeof(mix));
2141 
2142 		mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
2143 		mix.nchan = 1;
2144 		mix.wValue[0] = MAKE_WORD(UA_EXT_ENABLE, 0);
2145 		uaudio_mixer_determine_class(&iot[id], &mix);
2146 		mix.type = MIX_ON_OFF;
2147 
2148 		uaudio_mixer_add_ctl(sc, &mix);
2149 	}
2150 }
2151 
2152 static const void *
2153 uaudio_mixer_verify_desc(const void *arg, uint32_t len)
2154 {
2155 	const struct usb_audio_mixer_unit_1 *d1;
2156 	const struct usb_audio_extension_unit_1 *e1;
2157 	const struct usb_audio_processing_unit_1 *u1;
2158 
2159 	union {
2160 		const struct usb_descriptor *desc;
2161 		const struct usb_audio_input_terminal *it;
2162 		const struct usb_audio_output_terminal *ot;
2163 		const struct usb_audio_mixer_unit_0 *mu;
2164 		const struct usb_audio_selector_unit *su;
2165 		const struct usb_audio_feature_unit *fu;
2166 		const struct usb_audio_processing_unit_0 *pu;
2167 		const struct usb_audio_extension_unit_0 *eu;
2168 	}     u;
2169 
2170 	u.desc = arg;
2171 
2172 	if (u.desc == NULL) {
2173 		goto error;
2174 	}
2175 	if (u.desc->bDescriptorType != UDESC_CS_INTERFACE) {
2176 		goto error;
2177 	}
2178 	switch (u.desc->bDescriptorSubtype) {
2179 	case UDESCSUB_AC_INPUT:
2180 		len += sizeof(*u.it);
2181 		break;
2182 
2183 	case UDESCSUB_AC_OUTPUT:
2184 		len += sizeof(*u.ot);
2185 		break;
2186 
2187 	case UDESCSUB_AC_MIXER:
2188 		len += sizeof(*u.mu);
2189 
2190 		if (u.desc->bLength < len) {
2191 			goto error;
2192 		}
2193 		len += u.mu->bNrInPins;
2194 
2195 		if (u.desc->bLength < len) {
2196 			goto error;
2197 		}
2198 		d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins);
2199 
2200 		len += sizeof(*d1);
2201 		break;
2202 
2203 	case UDESCSUB_AC_SELECTOR:
2204 		len += sizeof(*u.su);
2205 
2206 		if (u.desc->bLength < len) {
2207 			goto error;
2208 		}
2209 		len += u.su->bNrInPins;
2210 		break;
2211 
2212 	case UDESCSUB_AC_FEATURE:
2213 		len += (sizeof(*u.fu) + 1);
2214 		break;
2215 
2216 	case UDESCSUB_AC_PROCESSING:
2217 		len += sizeof(*u.pu);
2218 
2219 		if (u.desc->bLength < len) {
2220 			goto error;
2221 		}
2222 		len += u.pu->bNrInPins;
2223 
2224 		if (u.desc->bLength < len) {
2225 			goto error;
2226 		}
2227 		u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins);
2228 
2229 		len += sizeof(*u1);
2230 
2231 		if (u.desc->bLength < len) {
2232 			goto error;
2233 		}
2234 		len += u1->bControlSize;
2235 
2236 		break;
2237 
2238 	case UDESCSUB_AC_EXTENSION:
2239 		len += sizeof(*u.eu);
2240 
2241 		if (u.desc->bLength < len) {
2242 			goto error;
2243 		}
2244 		len += u.eu->bNrInPins;
2245 
2246 		if (u.desc->bLength < len) {
2247 			goto error;
2248 		}
2249 		e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins);
2250 
2251 		len += sizeof(*e1);
2252 
2253 		if (u.desc->bLength < len) {
2254 			goto error;
2255 		}
2256 		len += e1->bControlSize;
2257 		break;
2258 
2259 	default:
2260 		goto error;
2261 	}
2262 
2263 	if (u.desc->bLength < len) {
2264 		goto error;
2265 	}
2266 	return (u.desc);
2267 
2268 error:
2269 	if (u.desc) {
2270 		DPRINTF("invalid descriptor, type=%d, "
2271 		    "sub_type=%d, len=%d of %d bytes\n",
2272 		    u.desc->bDescriptorType,
2273 		    u.desc->bDescriptorSubtype,
2274 		    u.desc->bLength, len);
2275 	}
2276 	return (NULL);
2277 }
2278 
2279 #ifdef USB_DEBUG
2280 static void
2281 uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
2282 {
2283 	static const char *channel_names[16] = {
2284 		"LEFT", "RIGHT", "CENTER", "LFE",
2285 		"LEFT_SURROUND", "RIGHT_SURROUND", "LEFT_CENTER", "RIGHT_CENTER",
2286 		"SURROUND", "LEFT_SIDE", "RIGHT_SIDE", "TOP",
2287 		"RESERVED12", "RESERVED13", "RESERVED14", "RESERVED15",
2288 	};
2289 	uint16_t cc;
2290 	uint8_t i;
2291 	const struct usb_audio_cluster cl = uaudio_mixer_get_cluster(id, iot);
2292 
2293 	cc = UGETW(cl.wChannelConfig);
2294 
2295 	DPRINTF("cluster: bNrChannels=%u iChannelNames=%u wChannelConfig="
2296 	    "0x%04x:\n", cl.iChannelNames, cl.bNrChannels, cc);
2297 
2298 	for (i = 0; cc; i++) {
2299 		if (cc & 1) {
2300 			DPRINTF(" - %s\n", channel_names[i]);
2301 		}
2302 		cc >>= 1;
2303 	}
2304 }
2305 
2306 #endif
2307 
2308 static struct usb_audio_cluster
2309 uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
2310 {
2311 	struct usb_audio_cluster r;
2312 	const struct usb_descriptor *dp;
2313 	uint8_t i;
2314 
2315 	for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) {	/* avoid infinite loops */
2316 		dp = iot[id].u.desc;
2317 		if (dp == NULL) {
2318 			goto error;
2319 		}
2320 		switch (dp->bDescriptorSubtype) {
2321 		case UDESCSUB_AC_INPUT:
2322 			r.bNrChannels = iot[id].u.it->bNrChannels;
2323 			r.wChannelConfig[0] = iot[id].u.it->wChannelConfig[0];
2324 			r.wChannelConfig[1] = iot[id].u.it->wChannelConfig[1];
2325 			r.iChannelNames = iot[id].u.it->iChannelNames;
2326 			goto done;
2327 
2328 		case UDESCSUB_AC_OUTPUT:
2329 			id = iot[id].u.ot->bSourceId;
2330 			break;
2331 
2332 		case UDESCSUB_AC_MIXER:
2333 			r = *(const struct usb_audio_cluster *)
2334 			    &iot[id].u.mu->baSourceId[iot[id].u.mu->
2335 			    bNrInPins];
2336 			goto done;
2337 
2338 		case UDESCSUB_AC_SELECTOR:
2339 			if (iot[id].u.su->bNrInPins > 0) {
2340 				/* XXX This is not really right */
2341 				id = iot[id].u.su->baSourceId[0];
2342 			}
2343 			break;
2344 
2345 		case UDESCSUB_AC_FEATURE:
2346 			id = iot[id].u.fu->bSourceId;
2347 			break;
2348 
2349 		case UDESCSUB_AC_PROCESSING:
2350 			r = *((const struct usb_audio_cluster *)
2351 			    &iot[id].u.pu->baSourceId[iot[id].u.pu->
2352 			    bNrInPins]);
2353 			goto done;
2354 
2355 		case UDESCSUB_AC_EXTENSION:
2356 			r = *((const struct usb_audio_cluster *)
2357 			    &iot[id].u.eu->baSourceId[iot[id].u.eu->
2358 			    bNrInPins]);
2359 			goto done;
2360 
2361 		default:
2362 			goto error;
2363 		}
2364 	}
2365 error:
2366 	DPRINTF("bad data\n");
2367 	memset(&r, 0, sizeof(r));
2368 done:
2369 	return (r);
2370 }
2371 
2372 #ifdef USB_DEBUG
2373 
2374 struct uaudio_tt_to_string {
2375 	uint16_t terminal_type;
2376 	const char *desc;
2377 };
2378 
2379 static const struct uaudio_tt_to_string uaudio_tt_to_string[] = {
2380 
2381 	/* USB terminal types */
2382 	{UAT_UNDEFINED, "UAT_UNDEFINED"},
2383 	{UAT_STREAM, "UAT_STREAM"},
2384 	{UAT_VENDOR, "UAT_VENDOR"},
2385 
2386 	/* input terminal types */
2387 	{UATI_UNDEFINED, "UATI_UNDEFINED"},
2388 	{UATI_MICROPHONE, "UATI_MICROPHONE"},
2389 	{UATI_DESKMICROPHONE, "UATI_DESKMICROPHONE"},
2390 	{UATI_PERSONALMICROPHONE, "UATI_PERSONALMICROPHONE"},
2391 	{UATI_OMNIMICROPHONE, "UATI_OMNIMICROPHONE"},
2392 	{UATI_MICROPHONEARRAY, "UATI_MICROPHONEARRAY"},
2393 	{UATI_PROCMICROPHONEARR, "UATI_PROCMICROPHONEARR"},
2394 
2395 	/* output terminal types */
2396 	{UATO_UNDEFINED, "UATO_UNDEFINED"},
2397 	{UATO_SPEAKER, "UATO_SPEAKER"},
2398 	{UATO_HEADPHONES, "UATO_HEADPHONES"},
2399 	{UATO_DISPLAYAUDIO, "UATO_DISPLAYAUDIO"},
2400 	{UATO_DESKTOPSPEAKER, "UATO_DESKTOPSPEAKER"},
2401 	{UATO_ROOMSPEAKER, "UATO_ROOMSPEAKER"},
2402 	{UATO_COMMSPEAKER, "UATO_COMMSPEAKER"},
2403 	{UATO_SUBWOOFER, "UATO_SUBWOOFER"},
2404 
2405 	/* bidir terminal types */
2406 	{UATB_UNDEFINED, "UATB_UNDEFINED"},
2407 	{UATB_HANDSET, "UATB_HANDSET"},
2408 	{UATB_HEADSET, "UATB_HEADSET"},
2409 	{UATB_SPEAKERPHONE, "UATB_SPEAKERPHONE"},
2410 	{UATB_SPEAKERPHONEESUP, "UATB_SPEAKERPHONEESUP"},
2411 	{UATB_SPEAKERPHONEECANC, "UATB_SPEAKERPHONEECANC"},
2412 
2413 	/* telephony terminal types */
2414 	{UATT_UNDEFINED, "UATT_UNDEFINED"},
2415 	{UATT_PHONELINE, "UATT_PHONELINE"},
2416 	{UATT_TELEPHONE, "UATT_TELEPHONE"},
2417 	{UATT_DOWNLINEPHONE, "UATT_DOWNLINEPHONE"},
2418 
2419 	/* external terminal types */
2420 	{UATE_UNDEFINED, "UATE_UNDEFINED"},
2421 	{UATE_ANALOGCONN, "UATE_ANALOGCONN"},
2422 	{UATE_LINECONN, "UATE_LINECONN"},
2423 	{UATE_LEGACYCONN, "UATE_LEGACYCONN"},
2424 	{UATE_DIGITALAUIFC, "UATE_DIGITALAUIFC"},
2425 	{UATE_SPDIF, "UATE_SPDIF"},
2426 	{UATE_1394DA, "UATE_1394DA"},
2427 	{UATE_1394DV, "UATE_1394DV"},
2428 
2429 	/* embedded function terminal types */
2430 	{UATF_UNDEFINED, "UATF_UNDEFINED"},
2431 	{UATF_CALIBNOISE, "UATF_CALIBNOISE"},
2432 	{UATF_EQUNOISE, "UATF_EQUNOISE"},
2433 	{UATF_CDPLAYER, "UATF_CDPLAYER"},
2434 	{UATF_DAT, "UATF_DAT"},
2435 	{UATF_DCC, "UATF_DCC"},
2436 	{UATF_MINIDISK, "UATF_MINIDISK"},
2437 	{UATF_ANALOGTAPE, "UATF_ANALOGTAPE"},
2438 	{UATF_PHONOGRAPH, "UATF_PHONOGRAPH"},
2439 	{UATF_VCRAUDIO, "UATF_VCRAUDIO"},
2440 	{UATF_VIDEODISCAUDIO, "UATF_VIDEODISCAUDIO"},
2441 	{UATF_DVDAUDIO, "UATF_DVDAUDIO"},
2442 	{UATF_TVTUNERAUDIO, "UATF_TVTUNERAUDIO"},
2443 	{UATF_SATELLITE, "UATF_SATELLITE"},
2444 	{UATF_CABLETUNER, "UATF_CABLETUNER"},
2445 	{UATF_DSS, "UATF_DSS"},
2446 	{UATF_RADIORECV, "UATF_RADIORECV"},
2447 	{UATF_RADIOXMIT, "UATF_RADIOXMIT"},
2448 	{UATF_MULTITRACK, "UATF_MULTITRACK"},
2449 	{UATF_SYNTHESIZER, "UATF_SYNTHESIZER"},
2450 
2451 	/* unknown */
2452 	{0x0000, "UNKNOWN"},
2453 };
2454 
2455 static const char *
2456 uaudio_mixer_get_terminal_name(uint16_t terminal_type)
2457 {
2458 	const struct uaudio_tt_to_string *uat = uaudio_tt_to_string;
2459 
2460 	while (uat->terminal_type) {
2461 		if (uat->terminal_type == terminal_type) {
2462 			break;
2463 		}
2464 		uat++;
2465 	}
2466 	if (uat->terminal_type == 0) {
2467 		DPRINTF("unknown terminal type (0x%04x)", terminal_type);
2468 	}
2469 	return (uat->desc);
2470 }
2471 
2472 #endif
2473 
2474 static uint16_t
2475 uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot,
2476     struct uaudio_mixer_node *mix)
2477 {
2478 	uint16_t terminal_type = 0x0000;
2479 	const struct uaudio_terminal_node *input[2];
2480 	const struct uaudio_terminal_node *output[2];
2481 
2482 	input[0] = uaudio_mixer_get_input(iot, 0);
2483 	input[1] = uaudio_mixer_get_input(iot, 1);
2484 
2485 	output[0] = uaudio_mixer_get_output(iot, 0);
2486 	output[1] = uaudio_mixer_get_output(iot, 1);
2487 
2488 	/*
2489 	 * check if there is only
2490 	 * one output terminal:
2491 	 */
2492 	if (output[0] && (!output[1])) {
2493 		terminal_type = UGETW(output[0]->u.ot->wTerminalType);
2494 	}
2495 	/*
2496 	 * If the only output terminal is USB,
2497 	 * the class is UAC_RECORD.
2498 	 */
2499 	if ((terminal_type & 0xff00) == (UAT_UNDEFINED & 0xff00)) {
2500 
2501 		mix->class = UAC_RECORD;
2502 		if (input[0] && (!input[1])) {
2503 			terminal_type = UGETW(input[0]->u.it->wTerminalType);
2504 		} else {
2505 			terminal_type = 0;
2506 		}
2507 		goto done;
2508 	}
2509 	/*
2510 	 * if the unit is connected to just
2511 	 * one input terminal, the
2512 	 * class is UAC_INPUT:
2513 	 */
2514 	if (input[0] && (!input[1])) {
2515 		mix->class = UAC_INPUT;
2516 		terminal_type = UGETW(input[0]->u.it->wTerminalType);
2517 		goto done;
2518 	}
2519 	/*
2520 	 * Otherwise, the class is UAC_OUTPUT.
2521 	 */
2522 	mix->class = UAC_OUTPUT;
2523 done:
2524 	return (terminal_type);
2525 }
2526 
2527 struct uaudio_tt_to_feature {
2528 	uint16_t terminal_type;
2529 	uint16_t feature;
2530 };
2531 
2532 static const struct uaudio_tt_to_feature uaudio_tt_to_feature[] = {
2533 
2534 	{UAT_STREAM, SOUND_MIXER_PCM},
2535 
2536 	{UATI_MICROPHONE, SOUND_MIXER_MIC},
2537 	{UATI_DESKMICROPHONE, SOUND_MIXER_MIC},
2538 	{UATI_PERSONALMICROPHONE, SOUND_MIXER_MIC},
2539 	{UATI_OMNIMICROPHONE, SOUND_MIXER_MIC},
2540 	{UATI_MICROPHONEARRAY, SOUND_MIXER_MIC},
2541 	{UATI_PROCMICROPHONEARR, SOUND_MIXER_MIC},
2542 
2543 	{UATO_SPEAKER, SOUND_MIXER_SPEAKER},
2544 	{UATO_DESKTOPSPEAKER, SOUND_MIXER_SPEAKER},
2545 	{UATO_ROOMSPEAKER, SOUND_MIXER_SPEAKER},
2546 	{UATO_COMMSPEAKER, SOUND_MIXER_SPEAKER},
2547 
2548 	{UATE_ANALOGCONN, SOUND_MIXER_LINE},
2549 	{UATE_LINECONN, SOUND_MIXER_LINE},
2550 	{UATE_LEGACYCONN, SOUND_MIXER_LINE},
2551 
2552 	{UATE_DIGITALAUIFC, SOUND_MIXER_ALTPCM},
2553 	{UATE_SPDIF, SOUND_MIXER_ALTPCM},
2554 	{UATE_1394DA, SOUND_MIXER_ALTPCM},
2555 	{UATE_1394DV, SOUND_MIXER_ALTPCM},
2556 
2557 	{UATF_CDPLAYER, SOUND_MIXER_CD},
2558 
2559 	{UATF_SYNTHESIZER, SOUND_MIXER_SYNTH},
2560 
2561 	{UATF_VIDEODISCAUDIO, SOUND_MIXER_VIDEO},
2562 	{UATF_DVDAUDIO, SOUND_MIXER_VIDEO},
2563 	{UATF_TVTUNERAUDIO, SOUND_MIXER_VIDEO},
2564 
2565 	/* telephony terminal types */
2566 	{UATT_UNDEFINED, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2567 	{UATT_PHONELINE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2568 	{UATT_TELEPHONE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2569 	{UATT_DOWNLINEPHONE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2570 
2571 	{UATF_RADIORECV, SOUND_MIXER_RADIO},
2572 	{UATF_RADIOXMIT, SOUND_MIXER_RADIO},
2573 
2574 	{UAT_UNDEFINED, SOUND_MIXER_VOLUME},
2575 	{UAT_VENDOR, SOUND_MIXER_VOLUME},
2576 	{UATI_UNDEFINED, SOUND_MIXER_VOLUME},
2577 
2578 	/* output terminal types */
2579 	{UATO_UNDEFINED, SOUND_MIXER_VOLUME},
2580 	{UATO_DISPLAYAUDIO, SOUND_MIXER_VOLUME},
2581 	{UATO_SUBWOOFER, SOUND_MIXER_VOLUME},
2582 	{UATO_HEADPHONES, SOUND_MIXER_VOLUME},
2583 
2584 	/* bidir terminal types */
2585 	{UATB_UNDEFINED, SOUND_MIXER_VOLUME},
2586 	{UATB_HANDSET, SOUND_MIXER_VOLUME},
2587 	{UATB_HEADSET, SOUND_MIXER_VOLUME},
2588 	{UATB_SPEAKERPHONE, SOUND_MIXER_VOLUME},
2589 	{UATB_SPEAKERPHONEESUP, SOUND_MIXER_VOLUME},
2590 	{UATB_SPEAKERPHONEECANC, SOUND_MIXER_VOLUME},
2591 
2592 	/* external terminal types */
2593 	{UATE_UNDEFINED, SOUND_MIXER_VOLUME},
2594 
2595 	/* embedded function terminal types */
2596 	{UATF_UNDEFINED, SOUND_MIXER_VOLUME},
2597 	{UATF_CALIBNOISE, SOUND_MIXER_VOLUME},
2598 	{UATF_EQUNOISE, SOUND_MIXER_VOLUME},
2599 	{UATF_DAT, SOUND_MIXER_VOLUME},
2600 	{UATF_DCC, SOUND_MIXER_VOLUME},
2601 	{UATF_MINIDISK, SOUND_MIXER_VOLUME},
2602 	{UATF_ANALOGTAPE, SOUND_MIXER_VOLUME},
2603 	{UATF_PHONOGRAPH, SOUND_MIXER_VOLUME},
2604 	{UATF_VCRAUDIO, SOUND_MIXER_VOLUME},
2605 	{UATF_SATELLITE, SOUND_MIXER_VOLUME},
2606 	{UATF_CABLETUNER, SOUND_MIXER_VOLUME},
2607 	{UATF_DSS, SOUND_MIXER_VOLUME},
2608 	{UATF_MULTITRACK, SOUND_MIXER_VOLUME},
2609 	{0xffff, SOUND_MIXER_VOLUME},
2610 
2611 	/* default */
2612 	{0x0000, SOUND_MIXER_VOLUME},
2613 };
2614 
2615 static uint16_t
2616 uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot,
2617     struct uaudio_mixer_node *mix)
2618 {
2619 	const struct uaudio_tt_to_feature *uat = uaudio_tt_to_feature;
2620 	uint16_t terminal_type = uaudio_mixer_determine_class(iot, mix);
2621 
2622 	if ((mix->class == UAC_RECORD) && (terminal_type == 0)) {
2623 		return (SOUND_MIXER_IMIX);
2624 	}
2625 	while (uat->terminal_type) {
2626 		if (uat->terminal_type == terminal_type) {
2627 			break;
2628 		}
2629 		uat++;
2630 	}
2631 
2632 	DPRINTF("terminal_type=%s (0x%04x) -> %d\n",
2633 	    uaudio_mixer_get_terminal_name(terminal_type),
2634 	    terminal_type, uat->feature);
2635 
2636 	return (uat->feature);
2637 }
2638 
2639 static const struct uaudio_terminal_node *
2640 uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t i)
2641 {
2642 	struct uaudio_terminal_node *root = iot->root;
2643 	uint8_t n;
2644 
2645 	n = iot->usr.id_max;
2646 	do {
2647 		if (iot->usr.bit_input[n / 8] & (1 << (n % 8))) {
2648 			if (!i--)
2649 				return (root + n);
2650 		}
2651 	} while (n--);
2652 
2653 	return (NULL);
2654 }
2655 
2656 static const struct uaudio_terminal_node *
2657 uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, uint8_t i)
2658 {
2659 	struct uaudio_terminal_node *root = iot->root;
2660 	uint8_t n;
2661 
2662 	n = iot->usr.id_max;
2663 	do {
2664 		if (iot->usr.bit_output[n / 8] & (1 << (n % 8))) {
2665 			if (!i--)
2666 				return (root + n);
2667 		}
2668 	} while (n--);
2669 
2670 	return (NULL);
2671 }
2672 
2673 static void
2674 uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
2675     const uint8_t *p_id, uint8_t n_id,
2676     struct uaudio_search_result *info)
2677 {
2678 	struct uaudio_terminal_node *iot;
2679 	uint8_t n;
2680 	uint8_t i;
2681 
2682 	if (info->recurse_level >= UAUDIO_RECURSE_LIMIT) {
2683 		return;
2684 	}
2685 	info->recurse_level++;
2686 
2687 	for (n = 0; n < n_id; n++) {
2688 
2689 		i = p_id[n];
2690 
2691 		if (info->bit_visited[i / 8] & (1 << (i % 8))) {
2692 			/* don't go into a circle */
2693 			DPRINTF("avoided going into a circle at id=%d!\n", i);
2694 			continue;
2695 		} else {
2696 			info->bit_visited[i / 8] |= (1 << (i % 8));
2697 		}
2698 
2699 		iot = (root + i);
2700 
2701 		if (iot->u.desc == NULL) {
2702 			continue;
2703 		}
2704 		switch (iot->u.desc->bDescriptorSubtype) {
2705 		case UDESCSUB_AC_INPUT:
2706 			info->bit_input[i / 8] |= (1 << (i % 8));
2707 			break;
2708 
2709 		case UDESCSUB_AC_FEATURE:
2710 			uaudio_mixer_find_inputs_sub
2711 			    (root, &iot->u.fu->bSourceId, 1, info);
2712 			break;
2713 
2714 		case UDESCSUB_AC_OUTPUT:
2715 			uaudio_mixer_find_inputs_sub
2716 			    (root, &iot->u.ot->bSourceId, 1, info);
2717 			break;
2718 
2719 		case UDESCSUB_AC_MIXER:
2720 			uaudio_mixer_find_inputs_sub
2721 			    (root, iot->u.mu->baSourceId,
2722 			    iot->u.mu->bNrInPins, info);
2723 			break;
2724 
2725 		case UDESCSUB_AC_SELECTOR:
2726 			uaudio_mixer_find_inputs_sub
2727 			    (root, iot->u.su->baSourceId,
2728 			    iot->u.su->bNrInPins, info);
2729 			break;
2730 
2731 		case UDESCSUB_AC_PROCESSING:
2732 			uaudio_mixer_find_inputs_sub
2733 			    (root, iot->u.pu->baSourceId,
2734 			    iot->u.pu->bNrInPins, info);
2735 			break;
2736 
2737 		case UDESCSUB_AC_EXTENSION:
2738 			uaudio_mixer_find_inputs_sub
2739 			    (root, iot->u.eu->baSourceId,
2740 			    iot->u.eu->bNrInPins, info);
2741 			break;
2742 
2743 		case UDESCSUB_AC_HEADER:
2744 		default:
2745 			break;
2746 		}
2747 	}
2748 	info->recurse_level--;
2749 }
2750 
2751 static void
2752 uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id,
2753     uint8_t n_id, struct uaudio_search_result *info)
2754 {
2755 	struct uaudio_terminal_node *iot = (root + id);
2756 	uint8_t j;
2757 
2758 	j = n_id;
2759 	do {
2760 		if ((j != id) && ((root + j)->u.desc) &&
2761 		    ((root + j)->u.desc->bDescriptorSubtype == UDESCSUB_AC_OUTPUT)) {
2762 
2763 			/*
2764 			 * "j" (output) <--- virtual wire <--- "id" (input)
2765 			 *
2766 			 * if "j" has "id" on the input, then "id" have "j" on
2767 			 * the output, because they are connected:
2768 			 */
2769 			if ((root + j)->usr.bit_input[id / 8] & (1 << (id % 8))) {
2770 				iot->usr.bit_output[j / 8] |= (1 << (j % 8));
2771 			}
2772 		}
2773 	} while (j--);
2774 }
2775 
2776 static void
2777 uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usb_device *udev,
2778     void *desc)
2779 {
2780 	const struct usb_audio_control_descriptor *acdp;
2781 	struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
2782 	const struct usb_descriptor *dp;
2783 	const struct usb_audio_unit *au;
2784 	struct uaudio_terminal_node *iot = NULL;
2785 	uint16_t wTotalLen;
2786 	uint8_t ID_max = 0;		/* inclusive */
2787 	uint8_t i;
2788 
2789 	desc = usb_desc_foreach(cd, desc);
2790 
2791 	if (desc == NULL) {
2792 		DPRINTF("no Audio Control header\n");
2793 		goto done;
2794 	}
2795 	acdp = desc;
2796 
2797 	if ((acdp->bLength < sizeof(*acdp)) ||
2798 	    (acdp->bDescriptorType != UDESC_CS_INTERFACE) ||
2799 	    (acdp->bDescriptorSubtype != UDESCSUB_AC_HEADER)) {
2800 		DPRINTF("invalid Audio Control header\n");
2801 		goto done;
2802 	}
2803 	/* "wTotalLen" is allowed to be corrupt */
2804 	wTotalLen = UGETW(acdp->wTotalLength) - acdp->bLength;
2805 
2806 	/* get USB audio revision */
2807 	sc->sc_audio_rev = UGETW(acdp->bcdADC);
2808 
2809 	DPRINTFN(3, "found AC header, vers=%03x, len=%d\n",
2810 	    sc->sc_audio_rev, wTotalLen);
2811 
2812 	if (sc->sc_audio_rev != UAUDIO_VERSION) {
2813 
2814 		if (sc->sc_uq_bad_adc) {
2815 
2816 		} else {
2817 			DPRINTF("invalid audio version\n");
2818 			goto done;
2819 		}
2820 	}
2821 	iot = malloc(sizeof(struct uaudio_terminal_node) * 256, M_TEMP,
2822 	    M_WAITOK | M_ZERO);
2823 
2824 	if (iot == NULL) {
2825 		DPRINTF("no memory!\n");
2826 		goto done;
2827 	}
2828 	while ((desc = usb_desc_foreach(cd, desc))) {
2829 
2830 		dp = desc;
2831 
2832 		if (dp->bLength > wTotalLen) {
2833 			break;
2834 		} else {
2835 			wTotalLen -= dp->bLength;
2836 		}
2837 
2838 		au = uaudio_mixer_verify_desc(dp, 0);
2839 
2840 		if (au) {
2841 			iot[au->bUnitId].u.desc = (const void *)au;
2842 			if (au->bUnitId > ID_max) {
2843 				ID_max = au->bUnitId;
2844 			}
2845 		}
2846 	}
2847 
2848 	DPRINTF("Maximum ID=%d\n", ID_max);
2849 
2850 	/*
2851 	 * determine sourcing inputs for
2852 	 * all nodes in the tree:
2853 	 */
2854 	i = ID_max;
2855 	do {
2856 		uaudio_mixer_find_inputs_sub(iot, &i, 1, &((iot + i)->usr));
2857 	} while (i--);
2858 
2859 	/*
2860 	 * determine outputs for
2861 	 * all nodes in the tree:
2862 	 */
2863 	i = ID_max;
2864 	do {
2865 		uaudio_mixer_find_outputs_sub(iot, i, ID_max, &((iot + i)->usr));
2866 	} while (i--);
2867 
2868 	/* set "id_max" and "root" */
2869 
2870 	i = ID_max;
2871 	do {
2872 		(iot + i)->usr.id_max = ID_max;
2873 		(iot + i)->root = iot;
2874 	} while (i--);
2875 
2876 #ifdef USB_DEBUG
2877 	i = ID_max;
2878 	do {
2879 		uint8_t j;
2880 
2881 		if (iot[i].u.desc == NULL) {
2882 			continue;
2883 		}
2884 		DPRINTF("id %d:\n", i);
2885 
2886 		switch (iot[i].u.desc->bDescriptorSubtype) {
2887 		case UDESCSUB_AC_INPUT:
2888 			DPRINTF(" - AC_INPUT type=%s\n",
2889 			    uaudio_mixer_get_terminal_name
2890 			    (UGETW(iot[i].u.it->wTerminalType)));
2891 			uaudio_mixer_dump_cluster(i, iot);
2892 			break;
2893 
2894 		case UDESCSUB_AC_OUTPUT:
2895 			DPRINTF(" - AC_OUTPUT type=%s "
2896 			    "src=%d\n", uaudio_mixer_get_terminal_name
2897 			    (UGETW(iot[i].u.ot->wTerminalType)),
2898 			    iot[i].u.ot->bSourceId);
2899 			break;
2900 
2901 		case UDESCSUB_AC_MIXER:
2902 			DPRINTF(" - AC_MIXER src:\n");
2903 			for (j = 0; j < iot[i].u.mu->bNrInPins; j++) {
2904 				DPRINTF("   - %d\n", iot[i].u.mu->baSourceId[j]);
2905 			}
2906 			uaudio_mixer_dump_cluster(i, iot);
2907 			break;
2908 
2909 		case UDESCSUB_AC_SELECTOR:
2910 			DPRINTF(" - AC_SELECTOR src:\n");
2911 			for (j = 0; j < iot[i].u.su->bNrInPins; j++) {
2912 				DPRINTF("   - %d\n", iot[i].u.su->baSourceId[j]);
2913 			}
2914 			break;
2915 
2916 		case UDESCSUB_AC_FEATURE:
2917 			DPRINTF(" - AC_FEATURE src=%d\n", iot[i].u.fu->bSourceId);
2918 			break;
2919 
2920 		case UDESCSUB_AC_PROCESSING:
2921 			DPRINTF(" - AC_PROCESSING src:\n");
2922 			for (j = 0; j < iot[i].u.pu->bNrInPins; j++) {
2923 				DPRINTF("   - %d\n", iot[i].u.pu->baSourceId[j]);
2924 			}
2925 			uaudio_mixer_dump_cluster(i, iot);
2926 			break;
2927 
2928 		case UDESCSUB_AC_EXTENSION:
2929 			DPRINTF(" - AC_EXTENSION src:\n");
2930 			for (j = 0; j < iot[i].u.eu->bNrInPins; j++) {
2931 				DPRINTF("%d ", iot[i].u.eu->baSourceId[j]);
2932 			}
2933 			uaudio_mixer_dump_cluster(i, iot);
2934 			break;
2935 
2936 		default:
2937 			DPRINTF("unknown audio control (subtype=%d)\n",
2938 			    iot[i].u.desc->bDescriptorSubtype);
2939 		}
2940 
2941 		DPRINTF("Inputs to this ID are:\n");
2942 
2943 		j = ID_max;
2944 		do {
2945 			if (iot[i].usr.bit_input[j / 8] & (1 << (j % 8))) {
2946 				DPRINTF("  -- ID=%d\n", j);
2947 			}
2948 		} while (j--);
2949 
2950 		DPRINTF("Outputs from this ID are:\n");
2951 
2952 		j = ID_max;
2953 		do {
2954 			if (iot[i].usr.bit_output[j / 8] & (1 << (j % 8))) {
2955 				DPRINTF("  -- ID=%d\n", j);
2956 			}
2957 		} while (j--);
2958 
2959 	} while (i--);
2960 #endif
2961 
2962 	/*
2963 	 * scan the config to create a linked
2964 	 * list of "mixer" nodes:
2965 	 */
2966 
2967 	i = ID_max;
2968 	do {
2969 		dp = iot[i].u.desc;
2970 
2971 		if (dp == NULL) {
2972 			continue;
2973 		}
2974 		DPRINTFN(11, "id=%d subtype=%d\n",
2975 		    i, dp->bDescriptorSubtype);
2976 
2977 		switch (dp->bDescriptorSubtype) {
2978 		case UDESCSUB_AC_HEADER:
2979 			DPRINTF("unexpected AC header\n");
2980 			break;
2981 
2982 		case UDESCSUB_AC_INPUT:
2983 			uaudio_mixer_add_input(sc, iot, i);
2984 			break;
2985 
2986 		case UDESCSUB_AC_OUTPUT:
2987 			uaudio_mixer_add_output(sc, iot, i);
2988 			break;
2989 
2990 		case UDESCSUB_AC_MIXER:
2991 			uaudio_mixer_add_mixer(sc, iot, i);
2992 			break;
2993 
2994 		case UDESCSUB_AC_SELECTOR:
2995 			uaudio_mixer_add_selector(sc, iot, i);
2996 			break;
2997 
2998 		case UDESCSUB_AC_FEATURE:
2999 			uaudio_mixer_add_feature(sc, iot, i);
3000 			break;
3001 
3002 		case UDESCSUB_AC_PROCESSING:
3003 			uaudio_mixer_add_processing(sc, iot, i);
3004 			break;
3005 
3006 		case UDESCSUB_AC_EXTENSION:
3007 			uaudio_mixer_add_extension(sc, iot, i);
3008 			break;
3009 
3010 		default:
3011 			DPRINTF("bad AC desc subtype=0x%02x\n",
3012 			    dp->bDescriptorSubtype);
3013 			break;
3014 		}
3015 
3016 	} while (i--);
3017 
3018 done:
3019 	if (iot) {
3020 		free(iot, M_TEMP);
3021 	}
3022 }
3023 
3024 static uint16_t
3025 uaudio_mixer_get(struct usb_device *udev, uint8_t what,
3026     struct uaudio_mixer_node *mc)
3027 {
3028 	struct usb_device_request req;
3029 	uint16_t val;
3030 	uint16_t len = MIX_SIZE(mc->type);
3031 	uint8_t data[4];
3032 	usb_error_t err;
3033 
3034 	if (mc->wValue[0] == -1) {
3035 		return (0);
3036 	}
3037 	req.bmRequestType = UT_READ_CLASS_INTERFACE;
3038 	req.bRequest = what;
3039 	USETW(req.wValue, mc->wValue[0]);
3040 	USETW(req.wIndex, mc->wIndex);
3041 	USETW(req.wLength, len);
3042 
3043 	err = usbd_do_request(udev, NULL, &req, data);
3044 	if (err) {
3045 		DPRINTF("err=%s\n", usbd_errstr(err));
3046 		return (0);
3047 	}
3048 	if (len < 1) {
3049 		data[0] = 0;
3050 	}
3051 	if (len < 2) {
3052 		data[1] = 0;
3053 	}
3054 	val = (data[0] | (data[1] << 8));
3055 
3056 	DPRINTFN(3, "val=%d\n", val);
3057 
3058 	return (val);
3059 }
3060 
3061 static void
3062 uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer, usb_error_t error)
3063 {
3064 	struct usb_device_request req;
3065 	struct uaudio_softc *sc = usbd_xfer_softc(xfer);
3066 	struct uaudio_mixer_node *mc = sc->sc_mixer_curr;
3067 	struct usb_page_cache *pc;
3068 	uint16_t len;
3069 	uint8_t repeat = 1;
3070 	uint8_t update;
3071 	uint8_t chan;
3072 	uint8_t buf[2];
3073 
3074 	DPRINTF("\n");
3075 
3076 	switch (USB_GET_STATE(xfer)) {
3077 	case USB_ST_TRANSFERRED:
3078 tr_transferred:
3079 	case USB_ST_SETUP:
3080 tr_setup:
3081 
3082 		if (mc == NULL) {
3083 			mc = sc->sc_mixer_root;
3084 			sc->sc_mixer_curr = mc;
3085 			sc->sc_mixer_chan = 0;
3086 			repeat = 0;
3087 		}
3088 		while (mc) {
3089 			while (sc->sc_mixer_chan < mc->nchan) {
3090 
3091 				len = MIX_SIZE(mc->type);
3092 
3093 				chan = sc->sc_mixer_chan;
3094 
3095 				sc->sc_mixer_chan++;
3096 
3097 				update = ((mc->update[chan / 8] & (1 << (chan % 8))) &&
3098 				    (mc->wValue[chan] != -1));
3099 
3100 				mc->update[chan / 8] &= ~(1 << (chan % 8));
3101 
3102 				if (update) {
3103 
3104 					req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
3105 					req.bRequest = SET_CUR;
3106 					USETW(req.wValue, mc->wValue[chan]);
3107 					USETW(req.wIndex, mc->wIndex);
3108 					USETW(req.wLength, len);
3109 
3110 					if (len > 0) {
3111 						buf[0] = (mc->wData[chan] & 0xFF);
3112 					}
3113 					if (len > 1) {
3114 						buf[1] = (mc->wData[chan] >> 8) & 0xFF;
3115 					}
3116 					pc = usbd_xfer_get_frame(xfer, 0);
3117 					usbd_copy_in(pc, 0, &req, sizeof(req));
3118 					pc = usbd_xfer_get_frame(xfer, 1);
3119 					usbd_copy_in(pc, 0, buf, len);
3120 
3121 					usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
3122 					usbd_xfer_set_frame_len(xfer, 1, len);
3123 					usbd_xfer_set_frames(xfer, len ? 2 : 1);
3124 					usbd_transfer_submit(xfer);
3125 					return;
3126 				}
3127 			}
3128 
3129 			mc = mc->next;
3130 			sc->sc_mixer_curr = mc;
3131 			sc->sc_mixer_chan = 0;
3132 		}
3133 
3134 		if (repeat) {
3135 			goto tr_setup;
3136 		}
3137 		break;
3138 
3139 	default:			/* Error */
3140 		DPRINTF("error=%s\n", usbd_errstr(error));
3141 		if (error == USB_ERR_CANCELLED) {
3142 			/* do nothing - we are detaching */
3143 			break;
3144 		}
3145 		goto tr_transferred;
3146 	}
3147 }
3148 
3149 static usb_error_t
3150 uaudio_set_speed(struct usb_device *udev, uint8_t endpt, uint32_t speed)
3151 {
3152 	struct usb_device_request req;
3153 	uint8_t data[3];
3154 
3155 	DPRINTFN(6, "endpt=%d speed=%u\n", endpt, speed);
3156 
3157 	req.bmRequestType = UT_WRITE_CLASS_ENDPOINT;
3158 	req.bRequest = SET_CUR;
3159 	USETW2(req.wValue, SAMPLING_FREQ_CONTROL, 0);
3160 	USETW(req.wIndex, endpt);
3161 	USETW(req.wLength, 3);
3162 	data[0] = speed;
3163 	data[1] = speed >> 8;
3164 	data[2] = speed >> 16;
3165 
3166 	return (usbd_do_request(udev, NULL, &req, data));
3167 }
3168 
3169 static int
3170 uaudio_mixer_signext(uint8_t type, int val)
3171 {
3172 	if (!MIX_UNSIGNED(type)) {
3173 		if (MIX_SIZE(type) == 2) {
3174 			val = (int16_t)val;
3175 		} else {
3176 			val = (int8_t)val;
3177 		}
3178 	}
3179 	return (val);
3180 }
3181 
3182 static int
3183 uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val)
3184 {
3185 	if (mc->type == MIX_ON_OFF) {
3186 		val = (val != 0);
3187 	} else if (mc->type == MIX_SELECTOR) {
3188 		if ((val < mc->minval) ||
3189 		    (val > mc->maxval)) {
3190 			val = mc->minval;
3191 		}
3192 	} else {
3193 
3194 		/* compute actual volume */
3195 		val = (val * mc->mul) / 255;
3196 
3197 		/* add lower offset */
3198 		val = val + mc->minval;
3199 
3200 		/* make sure we don't write a value out of range */
3201 		if (val > mc->maxval)
3202 			val = mc->maxval;
3203 		else if (val < mc->minval)
3204 			val = mc->minval;
3205 	}
3206 
3207 	DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n",
3208 	    mc->type, val, mc->minval, mc->maxval, val);
3209 	return (val);
3210 }
3211 
3212 static void
3213 uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
3214     uint8_t chan, int32_t val)
3215 {
3216 	val = uaudio_mixer_bsd2value(mc, val);
3217 
3218 	mc->update[chan / 8] |= (1 << (chan % 8));
3219 	mc->wData[chan] = val;
3220 
3221 	/* start the transfer, if not already started */
3222 
3223 	usbd_transfer_start(sc->sc_mixer_xfer[0]);
3224 }
3225 
3226 static void
3227 uaudio_mixer_init(struct uaudio_softc *sc)
3228 {
3229 	struct uaudio_mixer_node *mc;
3230 	int32_t i;
3231 
3232 	for (mc = sc->sc_mixer_root; mc;
3233 	    mc = mc->next) {
3234 
3235 		if (mc->ctl != SOUND_MIXER_NRDEVICES) {
3236 			/*
3237 			 * Set device mask bits. See
3238 			 * /usr/include/machine/soundcard.h
3239 			 */
3240 			sc->sc_mix_info |= (1 << mc->ctl);
3241 		}
3242 		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
3243 		    (mc->type == MIX_SELECTOR)) {
3244 
3245 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
3246 				if (mc->slctrtype[i - 1] == SOUND_MIXER_NRDEVICES) {
3247 					continue;
3248 				}
3249 				sc->sc_recsrc_info |= 1 << mc->slctrtype[i - 1];
3250 			}
3251 		}
3252 	}
3253 }
3254 
3255 int
3256 uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m)
3257 {
3258 	DPRINTF("\n");
3259 
3260 	if (usbd_transfer_setup(sc->sc_udev, &sc->sc_mixer_iface_index,
3261 	    sc->sc_mixer_xfer, uaudio_mixer_config, 1, sc,
3262 	    mixer_get_lock(m))) {
3263 		DPRINTFN(0, "could not allocate USB "
3264 		    "transfer for audio mixer!\n");
3265 		return (ENOMEM);
3266 	}
3267 	if (!(sc->sc_mix_info & SOUND_MASK_VOLUME)) {
3268 		mix_setparentchild(m, SOUND_MIXER_VOLUME, SOUND_MASK_PCM);
3269 		mix_setrealdev(m, SOUND_MIXER_VOLUME, SOUND_MIXER_NONE);
3270 	}
3271 	mix_setdevs(m, sc->sc_mix_info);
3272 	mix_setrecdevs(m, sc->sc_recsrc_info);
3273 	return (0);
3274 }
3275 
3276 int
3277 uaudio_mixer_uninit_sub(struct uaudio_softc *sc)
3278 {
3279 	DPRINTF("\n");
3280 
3281 	usbd_transfer_unsetup(sc->sc_mixer_xfer, 1);
3282 
3283 	return (0);
3284 }
3285 
3286 void
3287 uaudio_mixer_set(struct uaudio_softc *sc, unsigned type,
3288     unsigned left, unsigned right)
3289 {
3290 	struct uaudio_mixer_node *mc;
3291 
3292 	for (mc = sc->sc_mixer_root; mc;
3293 	    mc = mc->next) {
3294 
3295 		if (mc->ctl == type) {
3296 			if (mc->nchan == 2) {
3297 				/* set Right */
3298 				uaudio_mixer_ctl_set(sc, mc, 1, (int)(right * 255) / 100);
3299 			}
3300 			/* set Left or Mono */
3301 			uaudio_mixer_ctl_set(sc, mc, 0, (int)(left * 255) / 100);
3302 		}
3303 	}
3304 }
3305 
3306 uint32_t
3307 uaudio_mixer_setrecsrc(struct uaudio_softc *sc, uint32_t src)
3308 {
3309 	struct uaudio_mixer_node *mc;
3310 	uint32_t mask;
3311 	uint32_t temp;
3312 	int32_t i;
3313 
3314 	for (mc = sc->sc_mixer_root; mc;
3315 	    mc = mc->next) {
3316 
3317 		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
3318 		    (mc->type == MIX_SELECTOR)) {
3319 
3320 			/* compute selector mask */
3321 
3322 			mask = 0;
3323 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
3324 				mask |= (1 << mc->slctrtype[i - 1]);
3325 			}
3326 
3327 			temp = mask & src;
3328 			if (temp == 0) {
3329 				continue;
3330 			}
3331 			/* find the first set bit */
3332 			temp = (-temp) & temp;
3333 
3334 			/* update "src" */
3335 			src &= ~mask;
3336 			src |= temp;
3337 
3338 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
3339 				if (temp != (1 << mc->slctrtype[i - 1])) {
3340 					continue;
3341 				}
3342 				uaudio_mixer_ctl_set(sc, mc, 0, i);
3343 				break;
3344 			}
3345 		}
3346 	}
3347 	return (src);
3348 }
3349 
3350 /*========================================================================*
3351  * MIDI support routines
3352  *========================================================================*/
3353 
3354 static void
3355 umidi_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
3356 {
3357 	struct umidi_chan *chan = usbd_xfer_softc(xfer);
3358 	struct umidi_sub_chan *sub;
3359 	struct usb_page_cache *pc;
3360 	uint8_t buf[4];
3361 	uint8_t cmd_len;
3362 	uint8_t cn;
3363 	uint16_t pos;
3364 	int actlen;
3365 
3366 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
3367 
3368 	switch (USB_GET_STATE(xfer)) {
3369 	case USB_ST_TRANSFERRED:
3370 
3371 		DPRINTF("actlen=%d bytes\n", actlen);
3372 
3373 		pos = 0;
3374 		pc = usbd_xfer_get_frame(xfer, 0);
3375 
3376 		while (actlen >= 4) {
3377 
3378 			/* copy out the MIDI data */
3379 			usbd_copy_out(pc, pos, buf, 4);
3380 			/* command length */
3381 			cmd_len = umidi_cmd_to_len[buf[0] & 0xF];
3382 			/* cable number */
3383 			cn = buf[0] >> 4;
3384 			/*
3385 			 * Lookup sub-channel. The index is range
3386 			 * checked below.
3387 			 */
3388 			sub = &chan->sub[cn];
3389 
3390 			if ((cmd_len != 0) &&
3391 			    (cn < chan->max_cable) &&
3392 			    (sub->read_open != 0)) {
3393 
3394 				/* Send data to the application */
3395 				usb_fifo_put_data_linear(
3396 				    sub->fifo.fp[USB_FIFO_RX],
3397 				    buf + 1, cmd_len, 1);
3398 			}
3399 			actlen -= 4;
3400 			pos += 4;
3401 		}
3402 
3403 	case USB_ST_SETUP:
3404 		DPRINTF("start\n");
3405 tr_setup:
3406 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
3407 		usbd_transfer_submit(xfer);
3408 		break;
3409 
3410 	default:
3411 		DPRINTF("error=%s\n", usbd_errstr(error));
3412 
3413 		if (error != USB_ERR_CANCELLED) {
3414 			/* try to clear stall first */
3415 			usbd_xfer_set_stall(xfer);
3416 			goto tr_setup;
3417 		}
3418 		break;
3419 	}
3420 }
3421 
3422 /*
3423  * The following statemachine, that converts MIDI commands to
3424  * USB MIDI packets, derives from Linux's usbmidi.c, which
3425  * was written by "Clemens Ladisch":
3426  *
3427  * Returns:
3428  *    0: No command
3429  * Else: Command is complete
3430  */
3431 static uint8_t
3432 umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b)
3433 {
3434 	uint8_t p0 = (cn << 4);
3435 
3436 	if (b >= 0xf8) {
3437 		sub->temp_0[0] = p0 | 0x0f;
3438 		sub->temp_0[1] = b;
3439 		sub->temp_0[2] = 0;
3440 		sub->temp_0[3] = 0;
3441 		sub->temp_cmd = sub->temp_0;
3442 		return (1);
3443 
3444 	} else if (b >= 0xf0) {
3445 		switch (b) {
3446 		case 0xf0:		/* system exclusive begin */
3447 			sub->temp_1[1] = b;
3448 			sub->state = UMIDI_ST_SYSEX_1;
3449 			break;
3450 		case 0xf1:		/* MIDI time code */
3451 		case 0xf3:		/* song select */
3452 			sub->temp_1[1] = b;
3453 			sub->state = UMIDI_ST_1PARAM;
3454 			break;
3455 		case 0xf2:		/* song position pointer */
3456 			sub->temp_1[1] = b;
3457 			sub->state = UMIDI_ST_2PARAM_1;
3458 			break;
3459 		case 0xf4:		/* unknown */
3460 		case 0xf5:		/* unknown */
3461 			sub->state = UMIDI_ST_UNKNOWN;
3462 			break;
3463 		case 0xf6:		/* tune request */
3464 			sub->temp_1[0] = p0 | 0x05;
3465 			sub->temp_1[1] = 0xf6;
3466 			sub->temp_1[2] = 0;
3467 			sub->temp_1[3] = 0;
3468 			sub->temp_cmd = sub->temp_1;
3469 			sub->state = UMIDI_ST_UNKNOWN;
3470 			return (1);
3471 
3472 		case 0xf7:		/* system exclusive end */
3473 			switch (sub->state) {
3474 			case UMIDI_ST_SYSEX_0:
3475 				sub->temp_1[0] = p0 | 0x05;
3476 				sub->temp_1[1] = 0xf7;
3477 				sub->temp_1[2] = 0;
3478 				sub->temp_1[3] = 0;
3479 				sub->temp_cmd = sub->temp_1;
3480 				sub->state = UMIDI_ST_UNKNOWN;
3481 				return (1);
3482 			case UMIDI_ST_SYSEX_1:
3483 				sub->temp_1[0] = p0 | 0x06;
3484 				sub->temp_1[2] = 0xf7;
3485 				sub->temp_1[3] = 0;
3486 				sub->temp_cmd = sub->temp_1;
3487 				sub->state = UMIDI_ST_UNKNOWN;
3488 				return (1);
3489 			case UMIDI_ST_SYSEX_2:
3490 				sub->temp_1[0] = p0 | 0x07;
3491 				sub->temp_1[3] = 0xf7;
3492 				sub->temp_cmd = sub->temp_1;
3493 				sub->state = UMIDI_ST_UNKNOWN;
3494 				return (1);
3495 			}
3496 			sub->state = UMIDI_ST_UNKNOWN;
3497 			break;
3498 		}
3499 	} else if (b >= 0x80) {
3500 		sub->temp_1[1] = b;
3501 		if ((b >= 0xc0) && (b <= 0xdf)) {
3502 			sub->state = UMIDI_ST_1PARAM;
3503 		} else {
3504 			sub->state = UMIDI_ST_2PARAM_1;
3505 		}
3506 	} else {			/* b < 0x80 */
3507 		switch (sub->state) {
3508 		case UMIDI_ST_1PARAM:
3509 			if (sub->temp_1[1] < 0xf0) {
3510 				p0 |= sub->temp_1[1] >> 4;
3511 			} else {
3512 				p0 |= 0x02;
3513 				sub->state = UMIDI_ST_UNKNOWN;
3514 			}
3515 			sub->temp_1[0] = p0;
3516 			sub->temp_1[2] = b;
3517 			sub->temp_1[3] = 0;
3518 			sub->temp_cmd = sub->temp_1;
3519 			return (1);
3520 		case UMIDI_ST_2PARAM_1:
3521 			sub->temp_1[2] = b;
3522 			sub->state = UMIDI_ST_2PARAM_2;
3523 			break;
3524 		case UMIDI_ST_2PARAM_2:
3525 			if (sub->temp_1[1] < 0xf0) {
3526 				p0 |= sub->temp_1[1] >> 4;
3527 				sub->state = UMIDI_ST_2PARAM_1;
3528 			} else {
3529 				p0 |= 0x03;
3530 				sub->state = UMIDI_ST_UNKNOWN;
3531 			}
3532 			sub->temp_1[0] = p0;
3533 			sub->temp_1[3] = b;
3534 			sub->temp_cmd = sub->temp_1;
3535 			return (1);
3536 		case UMIDI_ST_SYSEX_0:
3537 			sub->temp_1[1] = b;
3538 			sub->state = UMIDI_ST_SYSEX_1;
3539 			break;
3540 		case UMIDI_ST_SYSEX_1:
3541 			sub->temp_1[2] = b;
3542 			sub->state = UMIDI_ST_SYSEX_2;
3543 			break;
3544 		case UMIDI_ST_SYSEX_2:
3545 			sub->temp_1[0] = p0 | 0x04;
3546 			sub->temp_1[3] = b;
3547 			sub->temp_cmd = sub->temp_1;
3548 			sub->state = UMIDI_ST_SYSEX_0;
3549 			return (1);
3550 		default:
3551 			break;
3552 		}
3553 	}
3554 	return (0);
3555 }
3556 
3557 static void
3558 umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
3559 {
3560 	struct umidi_chan *chan = usbd_xfer_softc(xfer);
3561 	struct umidi_sub_chan *sub;
3562 	struct usb_page_cache *pc;
3563 	uint32_t actlen;
3564 	uint16_t nframes;
3565 	uint8_t buf;
3566 	uint8_t start_cable;
3567 	uint8_t tr_any;
3568 	int len;
3569 
3570 	usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
3571 
3572 	/*
3573 	 * NOTE: Some MIDI devices only accept 4 bytes of data per
3574 	 * short terminated USB transfer.
3575 	 */
3576 	switch (USB_GET_STATE(xfer)) {
3577 	case USB_ST_TRANSFERRED:
3578 		DPRINTF("actlen=%d bytes\n", len);
3579 
3580 	case USB_ST_SETUP:
3581 tr_setup:
3582 		DPRINTF("start\n");
3583 
3584 		nframes = 0;	/* reset */
3585 		start_cable = chan->curr_cable;
3586 		tr_any = 0;
3587 		pc = usbd_xfer_get_frame(xfer, 0);
3588 
3589 		while (1) {
3590 
3591 			/* round robin de-queueing */
3592 
3593 			sub = &chan->sub[chan->curr_cable];
3594 
3595 			if (sub->write_open) {
3596 				usb_fifo_get_data_linear(sub->fifo.fp[USB_FIFO_TX],
3597 				    &buf, 1, &actlen, 0);
3598 			} else {
3599 				actlen = 0;
3600 			}
3601 
3602 			if (actlen) {
3603 
3604 				tr_any = 1;
3605 
3606 				DPRINTF("byte=0x%02x from FIFO %u\n", buf,
3607 				    (unsigned int)chan->curr_cable);
3608 
3609 				if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) {
3610 
3611 					DPRINTF("sub=0x%02x 0x%02x 0x%02x 0x%02x\n",
3612 					    sub->temp_cmd[0], sub->temp_cmd[1],
3613 					    sub->temp_cmd[2], sub->temp_cmd[3]);
3614 
3615 					usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4);
3616 
3617 					nframes++;
3618 
3619 					if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0))
3620 						break;
3621 				} else {
3622 					continue;
3623 				}
3624 			}
3625 
3626 			chan->curr_cable++;
3627 			if (chan->curr_cable >= chan->max_cable)
3628 				chan->curr_cable = 0;
3629 
3630 			if (chan->curr_cable == start_cable) {
3631 				if (tr_any == 0)
3632 					break;
3633 				tr_any = 0;
3634 			}
3635 		}
3636 
3637 		if (nframes != 0) {
3638 			DPRINTF("Transferring %d frames\n", (int)nframes);
3639 			usbd_xfer_set_frame_len(xfer, 0, 4 * nframes);
3640 			usbd_transfer_submit(xfer);
3641 		}
3642 		break;
3643 
3644 	default:			/* Error */
3645 
3646 		DPRINTF("error=%s\n", usbd_errstr(error));
3647 
3648 		if (error != USB_ERR_CANCELLED) {
3649 			/* try to clear stall first */
3650 			usbd_xfer_set_stall(xfer);
3651 			goto tr_setup;
3652 		}
3653 		break;
3654 	}
3655 }
3656 
3657 static struct umidi_sub_chan *
3658 umidi_sub_by_fifo(struct usb_fifo *fifo)
3659 {
3660 	struct umidi_chan *chan = usb_fifo_softc(fifo);
3661 	struct umidi_sub_chan *sub;
3662 	uint32_t n;
3663 
3664 	for (n = 0; n < UMIDI_CABLES_MAX; n++) {
3665 		sub = &chan->sub[n];
3666 		if ((sub->fifo.fp[USB_FIFO_RX] == fifo) ||
3667 		    (sub->fifo.fp[USB_FIFO_TX] == fifo)) {
3668 			return (sub);
3669 		}
3670 	}
3671 
3672 	panic("%s:%d cannot find usb_fifo!\n",
3673 	    __FILE__, __LINE__);
3674 
3675 	return (NULL);
3676 }
3677 
3678 static void
3679 umidi_start_read(struct usb_fifo *fifo)
3680 {
3681 	struct umidi_chan *chan = usb_fifo_softc(fifo);
3682 
3683 	usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]);
3684 }
3685 
3686 static void
3687 umidi_stop_read(struct usb_fifo *fifo)
3688 {
3689 	struct umidi_chan *chan = usb_fifo_softc(fifo);
3690 	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
3691 
3692 	DPRINTF("\n");
3693 
3694 	sub->read_open = 0;
3695 
3696 	if (--(chan->read_open_refcount) == 0) {
3697 		/*
3698 		 * XXX don't stop the read transfer here, hence that causes
3699 		 * problems with some MIDI adapters
3700 		 */
3701 		DPRINTF("(stopping read transfer)\n");
3702 	}
3703 }
3704 
3705 static void
3706 umidi_start_write(struct usb_fifo *fifo)
3707 {
3708 	struct umidi_chan *chan = usb_fifo_softc(fifo);
3709 
3710 	usbd_transfer_start(chan->xfer[UMIDI_TX_TRANSFER]);
3711 }
3712 
3713 static void
3714 umidi_stop_write(struct usb_fifo *fifo)
3715 {
3716 	struct umidi_chan *chan = usb_fifo_softc(fifo);
3717 	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
3718 
3719 	DPRINTF("\n");
3720 
3721 	sub->write_open = 0;
3722 
3723 	if (--(chan->write_open_refcount) == 0) {
3724 		DPRINTF("(stopping write transfer)\n");
3725 		usbd_transfer_stop(chan->xfer[UMIDI_TX_TRANSFER]);
3726 	}
3727 }
3728 
3729 static int
3730 umidi_open(struct usb_fifo *fifo, int fflags)
3731 {
3732 	struct umidi_chan *chan = usb_fifo_softc(fifo);
3733 	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
3734 
3735 	if (fflags & FREAD) {
3736 		if (usb_fifo_alloc_buffer(fifo, 4, (1024 / 4))) {
3737 			return (ENOMEM);
3738 		}
3739 		mtx_lock(&chan->mtx);
3740 		chan->read_open_refcount++;
3741 		sub->read_open = 1;
3742 		mtx_unlock(&chan->mtx);
3743 	}
3744 	if (fflags & FWRITE) {
3745 		if (usb_fifo_alloc_buffer(fifo, 32, (1024 / 32))) {
3746 			return (ENOMEM);
3747 		}
3748 		/* clear stall first */
3749 		mtx_lock(&chan->mtx);
3750 		usbd_xfer_set_stall(chan->xfer[UMIDI_TX_TRANSFER]);
3751 		chan->write_open_refcount++;
3752 		sub->write_open = 1;
3753 
3754 		/* reset */
3755 		sub->state = UMIDI_ST_UNKNOWN;
3756 		mtx_unlock(&chan->mtx);
3757 	}
3758 	return (0);			/* success */
3759 }
3760 
3761 static void
3762 umidi_close(struct usb_fifo *fifo, int fflags)
3763 {
3764 	if (fflags & FREAD) {
3765 		usb_fifo_free_buffer(fifo);
3766 	}
3767 	if (fflags & FWRITE) {
3768 		usb_fifo_free_buffer(fifo);
3769 	}
3770 }
3771 
3772 
3773 static int
3774 umidi_ioctl(struct usb_fifo *fifo, u_long cmd, void *data,
3775     int fflags)
3776 {
3777 	return (ENODEV);
3778 }
3779 
3780 static void
3781 umidi_init(device_t dev)
3782 {
3783 	struct uaudio_softc *sc = device_get_softc(dev);
3784 	struct umidi_chan *chan = &sc->sc_midi_chan;
3785 
3786 	mtx_init(&chan->mtx, "umidi lock", NULL, MTX_DEF | MTX_RECURSE);
3787 }
3788 
3789 static struct usb_fifo_methods umidi_fifo_methods = {
3790 	.f_start_read = &umidi_start_read,
3791 	.f_start_write = &umidi_start_write,
3792 	.f_stop_read = &umidi_stop_read,
3793 	.f_stop_write = &umidi_stop_write,
3794 	.f_open = &umidi_open,
3795 	.f_close = &umidi_close,
3796 	.f_ioctl = &umidi_ioctl,
3797 	.basename[0] = "umidi",
3798 };
3799 
3800 static int
3801 umidi_probe(device_t dev)
3802 {
3803 	struct uaudio_softc *sc = device_get_softc(dev);
3804 	struct usb_attach_arg *uaa = device_get_ivars(dev);
3805 	struct umidi_chan *chan = &sc->sc_midi_chan;
3806 	struct umidi_sub_chan *sub;
3807 	int unit = device_get_unit(dev);
3808 	int error;
3809 	uint32_t n;
3810 
3811 	if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI))
3812 		chan->single_command = 1;
3813 
3814 	if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index,
3815 	    chan->iface_alt_index)) {
3816 		DPRINTF("setting of alternate index failed!\n");
3817 		goto detach;
3818 	}
3819 	usbd_set_parent_iface(sc->sc_udev, chan->iface_index,
3820 	    sc->sc_mixer_iface_index);
3821 
3822 	error = usbd_transfer_setup(uaa->device, &chan->iface_index,
3823 	    chan->xfer, umidi_config, UMIDI_N_TRANSFER,
3824 	    chan, &chan->mtx);
3825 	if (error) {
3826 		DPRINTF("error=%s\n", usbd_errstr(error));
3827 		goto detach;
3828 	}
3829 	if ((chan->max_cable > UMIDI_CABLES_MAX) ||
3830 	    (chan->max_cable == 0)) {
3831 		chan->max_cable = UMIDI_CABLES_MAX;
3832 	}
3833 
3834 	for (n = 0; n < chan->max_cable; n++) {
3835 
3836 		sub = &chan->sub[n];
3837 
3838 		error = usb_fifo_attach(sc->sc_udev, chan, &chan->mtx,
3839 		    &umidi_fifo_methods, &sub->fifo, unit, n,
3840 		    chan->iface_index,
3841 		    UID_ROOT, GID_OPERATOR, 0644);
3842 		if (error) {
3843 			goto detach;
3844 		}
3845 	}
3846 
3847 	mtx_lock(&chan->mtx);
3848 
3849 	/* clear stall first */
3850 	usbd_xfer_set_stall(chan->xfer[UMIDI_RX_TRANSFER]);
3851 
3852 	/*
3853 	 * NOTE: At least one device will not work properly unless the
3854 	 * BULK IN pipe is open all the time. This might have to do
3855 	 * about that the internal queues of the device overflow if we
3856 	 * don't read them regularly.
3857 	 */
3858 	usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]);
3859 
3860 	mtx_unlock(&chan->mtx);
3861 
3862 	return (0);			/* success */
3863 
3864 detach:
3865 	return (ENXIO);			/* failure */
3866 }
3867 
3868 static int
3869 umidi_detach(device_t dev)
3870 {
3871 	struct uaudio_softc *sc = device_get_softc(dev);
3872 	struct umidi_chan *chan = &sc->sc_midi_chan;
3873 	uint32_t n;
3874 
3875 	for (n = 0; n < UMIDI_CABLES_MAX; n++) {
3876 		usb_fifo_detach(&chan->sub[n].fifo);
3877 	}
3878 
3879 	mtx_lock(&chan->mtx);
3880 
3881 	usbd_transfer_stop(chan->xfer[UMIDI_RX_TRANSFER]);
3882 
3883 	mtx_unlock(&chan->mtx);
3884 
3885 	usbd_transfer_unsetup(chan->xfer, UMIDI_N_TRANSFER);
3886 
3887 	mtx_destroy(&chan->mtx);
3888 
3889 	return (0);
3890 }
3891 
3892 DRIVER_MODULE(uaudio, uhub, uaudio_driver, uaudio_devclass, NULL, 0);
3893 MODULE_DEPEND(uaudio, usb, 1, 1, 1);
3894 MODULE_DEPEND(uaudio, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
3895 MODULE_VERSION(uaudio, 1);
3896