xref: /freebsd/sys/dev/sound/usb/uaudio.c (revision f05cddf9)
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 #include <dev/usb/usbhid.h>
75 #include <dev/usb/usb_request.h>
76 #include <dev/usb/usb_process.h>
77 
78 #define	USB_DEBUG_VAR uaudio_debug
79 #include <dev/usb/usb_debug.h>
80 
81 #include <dev/usb/quirk/usb_quirk.h>
82 
83 #include <sys/reboot.h>			/* for bootverbose */
84 
85 #ifdef HAVE_KERNEL_OPTION_HEADERS
86 #include "opt_snd.h"
87 #endif
88 
89 #include <dev/sound/pcm/sound.h>
90 #include <dev/sound/usb/uaudioreg.h>
91 #include <dev/sound/usb/uaudio.h>
92 #include <dev/sound/chip.h>
93 #include "feeder_if.h"
94 
95 static int uaudio_default_rate = 0;		/* use rate list */
96 static int uaudio_default_bits = 32;
97 static int uaudio_default_channels = 0;		/* use default */
98 
99 #ifdef USB_DEBUG
100 static int uaudio_debug = 0;
101 
102 static SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio");
103 
104 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW,
105     &uaudio_debug, 0, "uaudio debug level");
106 
107 TUNABLE_INT("hw.usb.uaudio.default_rate", &uaudio_default_rate);
108 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_rate, CTLFLAG_RW,
109     &uaudio_default_rate, 0, "uaudio default sample rate");
110 
111 TUNABLE_INT("hw.usb.uaudio.default_bits", &uaudio_default_bits);
112 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RW,
113     &uaudio_default_bits, 0, "uaudio default sample bits");
114 
115 TUNABLE_INT("hw.usb.uaudio.default_channels", &uaudio_default_channels);
116 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RW,
117     &uaudio_default_channels, 0, "uaudio default sample channels");
118 #endif
119 
120 #define	UAUDIO_NFRAMES		64	/* must be factor of 8 due HS-USB */
121 #define	UAUDIO_NCHANBUFS	2	/* number of outstanding request */
122 #define	UAUDIO_RECURSE_LIMIT	255	/* rounds */
123 
124 #define	MAKE_WORD(h,l) (((h) << 8) | (l))
125 #define	BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1)
126 #define	UAUDIO_MAX_CHAN(x) (x)
127 #define	MIX(sc) ((sc)->sc_mixer_node)
128 
129 union uaudio_asid {
130 	const struct usb_audio_streaming_interface_descriptor *v1;
131 	const struct usb_audio20_streaming_interface_descriptor *v2;
132 };
133 
134 union uaudio_asf1d {
135 	const struct usb_audio_streaming_type1_descriptor *v1;
136 	const struct usb_audio20_streaming_type1_descriptor *v2;
137 };
138 
139 union uaudio_sed {
140 	const struct usb_audio_streaming_endpoint_descriptor *v1;
141 	const struct usb_audio20_streaming_endpoint_descriptor *v2;
142 };
143 
144 struct uaudio_mixer_node {
145 	const char *name;
146 
147 	int32_t	minval;
148 	int32_t	maxval;
149 #define	MIX_MAX_CHAN 16
150 	int32_t	wValue[MIX_MAX_CHAN];	/* using nchan */
151 	uint32_t mul;
152 	uint32_t ctl;
153 
154 	int wData[MIX_MAX_CHAN];	/* using nchan */
155 	uint16_t wIndex;
156 
157 	uint8_t	update[(MIX_MAX_CHAN + 7) / 8];
158 	uint8_t	nchan;
159 	uint8_t	type;
160 #define	MIX_ON_OFF	1
161 #define	MIX_SIGNED_16	2
162 #define	MIX_UNSIGNED_16	3
163 #define	MIX_SIGNED_8	4
164 #define	MIX_SELECTOR	5
165 #define	MIX_UNKNOWN     6
166 #define	MIX_SIZE(n) ((((n) == MIX_SIGNED_16) || \
167 		      ((n) == MIX_UNSIGNED_16)) ? 2 : 1)
168 #define	MIX_UNSIGNED(n) ((n) == MIX_UNSIGNED_16)
169 
170 #define	MAX_SELECTOR_INPUT_PIN 256
171 	uint8_t	slctrtype[MAX_SELECTOR_INPUT_PIN];
172 	uint8_t	class;
173 	uint8_t val_default;
174 
175 	uint8_t desc[64];
176 
177 	struct uaudio_mixer_node *next;
178 };
179 
180 struct uaudio_configure_msg {
181 	struct usb_proc_msg hdr;
182 	struct uaudio_softc *sc;
183 };
184 
185 #define	CHAN_MAX_ALT 20
186 
187 struct uaudio_chan_alt {
188 	union uaudio_asf1d p_asf1d;
189 	union uaudio_sed p_sed;
190 	const usb_endpoint_descriptor_audio_t *p_ed1;
191 	const struct uaudio_format *p_fmt;
192 	const struct usb_config *usb_cfg;
193 	uint32_t sample_rate;	/* in Hz */
194 	uint16_t sample_size;
195 	uint8_t	iface_index;
196 	uint8_t	iface_alt_index;
197 	uint8_t channels;
198 };
199 
200 struct uaudio_chan {
201 	struct pcmchan_caps pcm_cap;	/* capabilities */
202 	struct uaudio_chan_alt usb_alt[CHAN_MAX_ALT];
203 	struct snd_dbuf *pcm_buf;
204 	struct mtx *pcm_mtx;		/* lock protecting this structure */
205 	struct uaudio_softc *priv_sc;
206 	struct pcm_channel *pcm_ch;
207 	struct usb_xfer *xfer[UAUDIO_NCHANBUFS + 1];
208 
209 	uint8_t *buf;			/* pointer to buffer */
210 	uint8_t *start;			/* upper layer buffer start */
211 	uint8_t *end;			/* upper layer buffer end */
212 	uint8_t *cur;			/* current position in upper layer
213 					 * buffer */
214 
215 	uint32_t intr_frames;		/* in units */
216 	uint32_t frames_per_second;
217 	uint32_t sample_rem;
218 	uint32_t sample_curr;
219 	uint32_t max_buf;
220 
221 	uint32_t pcm_format[2];
222 
223 	uint16_t bytes_per_frame[2];
224 
225 	uint8_t	num_alt;
226 	uint8_t cur_alt;
227 	uint8_t set_alt;
228 	uint8_t operation;
229 #define	CHAN_OP_NONE 0
230 #define	CHAN_OP_START 1
231 #define	CHAN_OP_STOP 2
232 #define	CHAN_OP_DRAIN 3
233 
234 	uint8_t last_sync_time;
235 	uint8_t last_sync_state;
236 #define	UAUDIO_SYNC_NONE 0
237 #define	UAUDIO_SYNC_MORE 1
238 #define	UAUDIO_SYNC_LESS 2
239 };
240 
241 #define	UMIDI_CABLES_MAX   16		/* units */
242 #define	UMIDI_TX_FRAMES	   256		/* units */
243 #define	UMIDI_TX_BUFFER    (UMIDI_TX_FRAMES * 4)	/* bytes */
244 
245 enum {
246 	UMIDI_TX_TRANSFER,
247 	UMIDI_RX_TRANSFER,
248 	UMIDI_N_TRANSFER,
249 };
250 
251 struct umidi_sub_chan {
252 	struct usb_fifo_sc fifo;
253 	uint8_t *temp_cmd;
254 	uint8_t	temp_0[4];
255 	uint8_t	temp_1[4];
256 	uint8_t	state;
257 #define	UMIDI_ST_UNKNOWN   0		/* scan for command */
258 #define	UMIDI_ST_1PARAM    1
259 #define	UMIDI_ST_2PARAM_1  2
260 #define	UMIDI_ST_2PARAM_2  3
261 #define	UMIDI_ST_SYSEX_0   4
262 #define	UMIDI_ST_SYSEX_1   5
263 #define	UMIDI_ST_SYSEX_2   6
264 
265 	uint8_t	read_open:1;
266 	uint8_t	write_open:1;
267 	uint8_t	unused:6;
268 };
269 
270 struct umidi_chan {
271 
272 	struct umidi_sub_chan sub[UMIDI_CABLES_MAX];
273 	struct mtx mtx;
274 
275 	struct usb_xfer *xfer[UMIDI_N_TRANSFER];
276 
277 	uint8_t	iface_index;
278 	uint8_t	iface_alt_index;
279 
280 	uint8_t	read_open_refcount;
281 	uint8_t	write_open_refcount;
282 
283 	uint8_t	curr_cable;
284 	uint8_t	max_cable;
285 	uint8_t	valid;
286 	uint8_t single_command;
287 };
288 
289 struct uaudio_search_result {
290 	uint8_t	bit_input[(256 + 7) / 8];
291 	uint8_t	bit_output[(256 + 7) / 8];
292 	uint8_t	recurse_level;
293 	uint8_t	id_max;
294 	uint8_t is_input;
295 };
296 
297 enum {
298 	UAUDIO_HID_RX_TRANSFER,
299 	UAUDIO_HID_N_TRANSFER,
300 };
301 
302 struct uaudio_hid {
303 	struct usb_xfer *xfer[UAUDIO_HID_N_TRANSFER];
304 	struct hid_location volume_up_loc;
305 	struct hid_location volume_down_loc;
306 	struct hid_location mute_loc;
307 	uint32_t flags;
308 #define	UAUDIO_HID_VALID		0x0001
309 #define	UAUDIO_HID_HAS_ID		0x0002
310 #define	UAUDIO_HID_HAS_VOLUME_UP	0x0004
311 #define	UAUDIO_HID_HAS_VOLUME_DOWN	0x0008
312 #define	UAUDIO_HID_HAS_MUTE		0x0010
313 	uint8_t iface_index;
314 	uint8_t volume_up_id;
315 	uint8_t volume_down_id;
316 	uint8_t mute_id;
317 };
318 
319 struct uaudio_softc {
320 	struct sbuf sc_sndstat;
321 	struct sndcard_func sc_sndcard_func;
322 	struct uaudio_chan sc_rec_chan;
323 	struct uaudio_chan sc_play_chan;
324 	struct umidi_chan sc_midi_chan;
325 	struct uaudio_hid sc_hid;
326 	struct uaudio_search_result sc_mixer_clocks;
327 	struct uaudio_mixer_node sc_mixer_node;
328 	struct uaudio_configure_msg sc_config_msg[2];
329 
330 	struct mtx *sc_mixer_lock;
331 	struct snd_mixer *sc_mixer_dev;
332 	struct usb_device *sc_udev;
333 	struct usb_xfer *sc_mixer_xfer[1];
334 	struct uaudio_mixer_node *sc_mixer_root;
335 	struct uaudio_mixer_node *sc_mixer_curr;
336 
337 	uint32_t sc_mix_info;
338 	uint32_t sc_recsrc_info;
339 
340 	uint16_t sc_audio_rev;
341 	uint16_t sc_mixer_count;
342 
343 	uint8_t	sc_sndstat_valid;
344 	uint8_t	sc_mixer_iface_index;
345 	uint8_t	sc_mixer_iface_no;
346 	uint8_t	sc_mixer_chan;
347 	uint8_t	sc_pcm_registered:1;
348 	uint8_t	sc_mixer_init:1;
349 	uint8_t	sc_uq_audio_swap_lr:1;
350 	uint8_t	sc_uq_au_inp_async:1;
351 	uint8_t	sc_uq_au_no_xu:1;
352 	uint8_t	sc_uq_bad_adc:1;
353 	uint8_t	sc_uq_au_vendor_class:1;
354 };
355 
356 struct uaudio_terminal_node {
357 	union {
358 		const struct usb_descriptor *desc;
359 		const struct usb_audio_input_terminal *it_v1;
360 		const struct usb_audio_output_terminal *ot_v1;
361 		const struct usb_audio_mixer_unit_0 *mu_v1;
362 		const struct usb_audio_selector_unit *su_v1;
363 		const struct usb_audio_feature_unit *fu_v1;
364 		const struct usb_audio_processing_unit_0 *pu_v1;
365 		const struct usb_audio_extension_unit_0 *eu_v1;
366 		const struct usb_audio20_clock_source_unit *csrc_v2;
367 		const struct usb_audio20_clock_selector_unit_0 *csel_v2;
368 		const struct usb_audio20_clock_multiplier_unit *cmul_v2;
369 		const struct usb_audio20_input_terminal *it_v2;
370 		const struct usb_audio20_output_terminal *ot_v2;
371 		const struct usb_audio20_mixer_unit_0 *mu_v2;
372 		const struct usb_audio20_selector_unit *su_v2;
373 		const struct usb_audio20_feature_unit *fu_v2;
374 		const struct usb_audio20_sample_rate_unit *ru_v2;
375 		const struct usb_audio20_processing_unit_0 *pu_v2;
376 		const struct usb_audio20_extension_unit_0 *eu_v2;
377 		const struct usb_audio20_effect_unit *ef_v2;
378 	}	u;
379 	struct uaudio_search_result usr;
380 	struct uaudio_terminal_node *root;
381 };
382 
383 struct uaudio_format {
384 	uint16_t wFormat;
385 	uint8_t	bPrecision;
386 	uint32_t freebsd_fmt;
387 	const char *description;
388 };
389 
390 static const struct uaudio_format uaudio10_formats[] = {
391 
392 	{UA_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"},
393 	{UA_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"},
394 	{UA_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"},
395 	{UA_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"},
396 
397 	{UA_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"},
398 	{UA_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"},
399 	{UA_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"},
400 	{UA_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"},
401 
402 	{UA_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"},
403 	{UA_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"},
404 
405 	{0, 0, 0, NULL}
406 };
407 
408 static const struct uaudio_format uaudio20_formats[] = {
409 
410 	{UA20_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"},
411 	{UA20_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"},
412 	{UA20_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"},
413 	{UA20_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"},
414 
415 	{UA20_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"},
416 	{UA20_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"},
417 	{UA20_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"},
418 	{UA20_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"},
419 
420 	{UA20_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"},
421 	{UA20_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"},
422 
423 	{0, 0, 0, NULL}
424 };
425 
426 #define	UAC_OUTPUT	0
427 #define	UAC_INPUT	1
428 #define	UAC_EQUAL	2
429 #define	UAC_RECORD	3
430 #define	UAC_NCLASSES	4
431 
432 #ifdef USB_DEBUG
433 static const char *uac_names[] = {
434 	"outputs", "inputs", "equalization", "record"
435 };
436 
437 #endif
438 
439 /* prototypes */
440 
441 static device_probe_t uaudio_probe;
442 static device_attach_t uaudio_attach;
443 static device_detach_t uaudio_detach;
444 
445 static usb_callback_t uaudio_chan_play_callback;
446 static usb_callback_t uaudio_chan_play_sync_callback;
447 static usb_callback_t uaudio_chan_record_callback;
448 static usb_callback_t uaudio_chan_record_sync_callback;
449 static usb_callback_t uaudio_mixer_write_cfg_callback;
450 static usb_callback_t umidi_bulk_read_callback;
451 static usb_callback_t umidi_bulk_write_callback;
452 static usb_callback_t uaudio_hid_rx_callback;
453 
454 static usb_proc_callback_t uaudio_configure_msg;
455 
456 /* ==== USB mixer ==== */
457 
458 static int uaudio_mixer_sysctl_handler(SYSCTL_HANDLER_ARGS);
459 static void uaudio_mixer_ctl_free(struct uaudio_softc *);
460 static void uaudio_mixer_register_sysctl(struct uaudio_softc *, device_t);
461 static void uaudio_mixer_reload_all(struct uaudio_softc *);
462 static void uaudio_mixer_controls_create_ftu(struct uaudio_softc *);
463 
464 /* ==== USB audio v1.0 ==== */
465 
466 static void	uaudio_mixer_add_mixer(struct uaudio_softc *,
467 		    const struct uaudio_terminal_node *, int);
468 static void	uaudio_mixer_add_selector(struct uaudio_softc *,
469 		    const struct uaudio_terminal_node *, int);
470 static uint32_t	uaudio_mixer_feature_get_bmaControls(
471 		    const struct usb_audio_feature_unit *, uint8_t);
472 static void	uaudio_mixer_add_feature(struct uaudio_softc *,
473 		    const struct uaudio_terminal_node *, int);
474 static void	uaudio_mixer_add_processing_updown(struct uaudio_softc *,
475 		    const struct uaudio_terminal_node *, int);
476 static void	uaudio_mixer_add_processing(struct uaudio_softc *,
477 		    const struct uaudio_terminal_node *, int);
478 static void	uaudio_mixer_add_extension(struct uaudio_softc *,
479 		    const struct uaudio_terminal_node *, int);
480 static struct	usb_audio_cluster uaudio_mixer_get_cluster(uint8_t,
481 		    const struct uaudio_terminal_node *);
482 static uint16_t	uaudio_mixer_determine_class(const struct uaudio_terminal_node *,
483 		    struct uaudio_mixer_node *);
484 static uint16_t	uaudio_mixer_feature_name(const struct uaudio_terminal_node *,
485 		    struct uaudio_mixer_node *);
486 static void	uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *,
487 		    const uint8_t *, uint8_t, struct uaudio_search_result *);
488 static const void *uaudio_mixer_verify_desc(const void *, uint32_t);
489 static usb_error_t uaudio_set_speed(struct usb_device *, uint8_t, uint32_t);
490 static int	uaudio_mixer_get(struct usb_device *, uint16_t, uint8_t,
491 		    struct uaudio_mixer_node *);
492 
493 /* ==== USB audio v2.0 ==== */
494 
495 static void	uaudio20_mixer_add_mixer(struct uaudio_softc *,
496 		    const struct uaudio_terminal_node *, int);
497 static void	uaudio20_mixer_add_selector(struct uaudio_softc *,
498 		    const struct uaudio_terminal_node *, int);
499 static void	uaudio20_mixer_add_feature(struct uaudio_softc *,
500 		    const struct uaudio_terminal_node *, int);
501 static struct	usb_audio20_cluster uaudio20_mixer_get_cluster(uint8_t,
502 		    const struct uaudio_terminal_node *);
503 static uint16_t	uaudio20_mixer_determine_class(const struct uaudio_terminal_node *,
504 		    struct uaudio_mixer_node *);
505 static uint16_t	uaudio20_mixer_feature_name(const struct uaudio_terminal_node *,
506 		    struct uaudio_mixer_node *);
507 static void	uaudio20_mixer_find_inputs_sub(struct uaudio_terminal_node *,
508 		    const uint8_t *, uint8_t, struct uaudio_search_result *);
509 static const void *uaudio20_mixer_verify_desc(const void *, uint32_t);
510 static usb_error_t uaudio20_set_speed(struct usb_device *, uint8_t,
511 		    uint8_t, uint32_t);
512 
513 /* USB audio v1.0 and v2.0 */
514 
515 static void	uaudio_chan_fill_info_sub(struct uaudio_softc *,
516 		    struct usb_device *, uint32_t, uint8_t, uint8_t);
517 static void	uaudio_chan_fill_info(struct uaudio_softc *,
518 		    struct usb_device *);
519 static void	uaudio_mixer_add_ctl_sub(struct uaudio_softc *,
520 		    struct uaudio_mixer_node *);
521 static void	uaudio_mixer_add_ctl(struct uaudio_softc *,
522 		    struct uaudio_mixer_node *);
523 static void	uaudio_mixer_fill_info(struct uaudio_softc *,
524 		    struct usb_device *, void *);
525 static void	uaudio_mixer_ctl_set(struct uaudio_softc *,
526 		    struct uaudio_mixer_node *, uint8_t, int32_t val);
527 static int	uaudio_mixer_signext(uint8_t, int);
528 static int	uaudio_mixer_bsd2value(struct uaudio_mixer_node *, int32_t val);
529 static void	uaudio_mixer_init(struct uaudio_softc *);
530 static const struct uaudio_terminal_node *uaudio_mixer_get_input(
531 		    const struct uaudio_terminal_node *, uint8_t);
532 static const struct uaudio_terminal_node *uaudio_mixer_get_output(
533 		    const struct uaudio_terminal_node *, uint8_t);
534 static void	uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *,
535 		    uint8_t, uint8_t, struct uaudio_search_result *);
536 static uint8_t	umidi_convert_to_usb(struct umidi_sub_chan *, uint8_t, uint8_t);
537 static struct	umidi_sub_chan *umidi_sub_by_fifo(struct usb_fifo *);
538 static void	umidi_start_read(struct usb_fifo *);
539 static void	umidi_stop_read(struct usb_fifo *);
540 static void	umidi_start_write(struct usb_fifo *);
541 static void	umidi_stop_write(struct usb_fifo *);
542 static int	umidi_open(struct usb_fifo *, int);
543 static int	umidi_ioctl(struct usb_fifo *, u_long cmd, void *, int);
544 static void	umidi_close(struct usb_fifo *, int);
545 static void	umidi_init(device_t dev);
546 static int	umidi_probe(device_t dev);
547 static int	umidi_detach(device_t dev);
548 static int	uaudio_hid_probe(struct uaudio_softc *sc,
549 		    struct usb_attach_arg *uaa);
550 static void	uaudio_hid_detach(struct uaudio_softc *sc);
551 
552 #ifdef USB_DEBUG
553 static void	uaudio_chan_dump_ep_desc(
554 		    const usb_endpoint_descriptor_audio_t *);
555 #endif
556 
557 static const struct usb_config
558 	uaudio_cfg_record[UAUDIO_NCHANBUFS + 1] = {
559 	[0] = {
560 		.type = UE_ISOCHRONOUS,
561 		.endpoint = UE_ADDR_ANY,
562 		.direction = UE_DIR_IN,
563 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
564 		.frames = UAUDIO_NFRAMES,
565 		.flags = {.short_xfer_ok = 1,},
566 		.callback = &uaudio_chan_record_callback,
567 	},
568 
569 	[1] = {
570 		.type = UE_ISOCHRONOUS,
571 		.endpoint = UE_ADDR_ANY,
572 		.direction = UE_DIR_IN,
573 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
574 		.frames = UAUDIO_NFRAMES,
575 		.flags = {.short_xfer_ok = 1,},
576 		.callback = &uaudio_chan_record_callback,
577 	},
578 
579 	[2] = {
580 		.type = UE_ISOCHRONOUS,
581 		.endpoint = UE_ADDR_ANY,
582 		.direction = UE_DIR_OUT,
583 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
584 		.frames = 1,
585 		.flags = {.no_pipe_ok = 1,.short_xfer_ok = 1,},
586 		.callback = &uaudio_chan_record_sync_callback,
587 	},
588 };
589 
590 static const struct usb_config
591 	uaudio_cfg_play[UAUDIO_NCHANBUFS + 1] = {
592 	[0] = {
593 		.type = UE_ISOCHRONOUS,
594 		.endpoint = UE_ADDR_ANY,
595 		.direction = UE_DIR_OUT,
596 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
597 		.frames = UAUDIO_NFRAMES,
598 		.flags = {.short_xfer_ok = 1,},
599 		.callback = &uaudio_chan_play_callback,
600 	},
601 
602 	[1] = {
603 		.type = UE_ISOCHRONOUS,
604 		.endpoint = UE_ADDR_ANY,
605 		.direction = UE_DIR_OUT,
606 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
607 		.frames = UAUDIO_NFRAMES,
608 		.flags = {.short_xfer_ok = 1,},
609 		.callback = &uaudio_chan_play_callback,
610 	},
611 
612 	[2] = {
613 		.type = UE_ISOCHRONOUS,
614 		.endpoint = UE_ADDR_ANY,
615 		.direction = UE_DIR_IN,
616 		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
617 		.frames = 1,
618 		.flags = {.no_pipe_ok = 1,.short_xfer_ok = 1,},
619 		.callback = &uaudio_chan_play_sync_callback,
620 	},
621 };
622 
623 static const struct usb_config
624 	uaudio_mixer_config[1] = {
625 	[0] = {
626 		.type = UE_CONTROL,
627 		.endpoint = 0x00,	/* Control pipe */
628 		.direction = UE_DIR_ANY,
629 		.bufsize = (sizeof(struct usb_device_request) + 4),
630 		.callback = &uaudio_mixer_write_cfg_callback,
631 		.timeout = 1000,	/* 1 second */
632 	},
633 };
634 
635 static const
636 uint8_t	umidi_cmd_to_len[16] = {
637 	[0x0] = 0,			/* reserved */
638 	[0x1] = 0,			/* reserved */
639 	[0x2] = 2,			/* bytes */
640 	[0x3] = 3,			/* bytes */
641 	[0x4] = 3,			/* bytes */
642 	[0x5] = 1,			/* bytes */
643 	[0x6] = 2,			/* bytes */
644 	[0x7] = 3,			/* bytes */
645 	[0x8] = 3,			/* bytes */
646 	[0x9] = 3,			/* bytes */
647 	[0xA] = 3,			/* bytes */
648 	[0xB] = 3,			/* bytes */
649 	[0xC] = 2,			/* bytes */
650 	[0xD] = 2,			/* bytes */
651 	[0xE] = 3,			/* bytes */
652 	[0xF] = 1,			/* bytes */
653 };
654 
655 static const struct usb_config
656 	umidi_config[UMIDI_N_TRANSFER] = {
657 	[UMIDI_TX_TRANSFER] = {
658 		.type = UE_BULK,
659 		.endpoint = UE_ADDR_ANY,
660 		.direction = UE_DIR_OUT,
661 		.bufsize = UMIDI_TX_BUFFER,
662 		.callback = &umidi_bulk_write_callback,
663 	},
664 
665 	[UMIDI_RX_TRANSFER] = {
666 		.type = UE_BULK,
667 		.endpoint = UE_ADDR_ANY,
668 		.direction = UE_DIR_IN,
669 		.bufsize = 4,	/* bytes */
670 		.flags = {.short_xfer_ok = 1,.proxy_buffer = 1,},
671 		.callback = &umidi_bulk_read_callback,
672 	},
673 };
674 
675 static const struct usb_config
676 	uaudio_hid_config[UAUDIO_HID_N_TRANSFER] = {
677 	[UAUDIO_HID_RX_TRANSFER] = {
678 		.type = UE_INTERRUPT,
679 		.endpoint = UE_ADDR_ANY,
680 		.direction = UE_DIR_IN,
681 		.bufsize = 0,	/* use wMaxPacketSize */
682 		.flags = {.short_xfer_ok = 1,},
683 		.callback = &uaudio_hid_rx_callback,
684 	},
685 };
686 
687 static devclass_t uaudio_devclass;
688 
689 static device_method_t uaudio_methods[] = {
690 	DEVMETHOD(device_probe, uaudio_probe),
691 	DEVMETHOD(device_attach, uaudio_attach),
692 	DEVMETHOD(device_detach, uaudio_detach),
693 	DEVMETHOD(device_suspend, bus_generic_suspend),
694 	DEVMETHOD(device_resume, bus_generic_resume),
695 	DEVMETHOD(device_shutdown, bus_generic_shutdown),
696 
697 	DEVMETHOD_END
698 };
699 
700 static driver_t uaudio_driver = {
701 	.name = "uaudio",
702 	.methods = uaudio_methods,
703 	.size = sizeof(struct uaudio_softc),
704 };
705 
706 /* The following table is derived from Linux's quirks-table.h */
707 static const STRUCT_USB_HOST_ID uaudio_vendor_midi[] = {
708 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1000, 0) }, /* UX256 */
709 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1001, 0) }, /* MU1000 */
710 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1002, 0) }, /* MU2000 */
711 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1003, 0) }, /* MU500 */
712 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1004, 3) }, /* UW500 */
713 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1005, 0) }, /* MOTIF6 */
714 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1006, 0) }, /* MOTIF7 */
715 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1007, 0) }, /* MOTIF8 */
716 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1008, 0) }, /* UX96 */
717 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1009, 0) }, /* UX16 */
718 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100a, 3) }, /* EOS BX */
719 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100c, 0) }, /* UC-MX */
720 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100d, 0) }, /* UC-KX */
721 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100e, 0) }, /* S08 */
722 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100f, 0) }, /* CLP-150 */
723 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1010, 0) }, /* CLP-170 */
724 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1011, 0) }, /* P-250 */
725 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1012, 0) }, /* TYROS */
726 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1013, 0) }, /* PF-500 */
727 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1014, 0) }, /* S90 */
728 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1015, 0) }, /* MOTIF-R */
729 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1016, 0) }, /* MDP-5 */
730 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1017, 0) }, /* CVP-204 */
731 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1018, 0) }, /* CVP-206 */
732 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1019, 0) }, /* CVP-208 */
733 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101a, 0) }, /* CVP-210 */
734 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101b, 0) }, /* PSR-1100 */
735 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101c, 0) }, /* PSR-2100 */
736 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101d, 0) }, /* CLP-175 */
737 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101e, 0) }, /* PSR-K1 */
738 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101f, 0) }, /* EZ-J24 */
739 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1020, 0) }, /* EZ-250i */
740 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1021, 0) }, /* MOTIF ES 6 */
741 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1022, 0) }, /* MOTIF ES 7 */
742 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1023, 0) }, /* MOTIF ES 8 */
743 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1024, 0) }, /* CVP-301 */
744 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1025, 0) }, /* CVP-303 */
745 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1026, 0) }, /* CVP-305 */
746 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1027, 0) }, /* CVP-307 */
747 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1028, 0) }, /* CVP-309 */
748 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1029, 0) }, /* CVP-309GP */
749 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x102a, 0) }, /* PSR-1500 */
750 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x102b, 0) }, /* PSR-3000 */
751 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x102e, 0) }, /* ELS-01/01C */
752 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1030, 0) }, /* PSR-295/293 */
753 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1031, 0) }, /* DGX-205/203 */
754 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1032, 0) }, /* DGX-305 */
755 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1033, 0) }, /* DGX-505 */
756 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1034, 0) }, /* NULL */
757 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1035, 0) }, /* NULL */
758 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1036, 0) }, /* NULL */
759 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1037, 0) }, /* NULL */
760 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1038, 0) }, /* NULL */
761 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1039, 0) }, /* NULL */
762 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103a, 0) }, /* NULL */
763 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103b, 0) }, /* NULL */
764 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103c, 0) }, /* NULL */
765 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103d, 0) }, /* NULL */
766 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103e, 0) }, /* NULL */
767 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103f, 0) }, /* NULL */
768 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1040, 0) }, /* NULL */
769 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1041, 0) }, /* NULL */
770 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1042, 0) }, /* NULL */
771 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1043, 0) }, /* NULL */
772 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1044, 0) }, /* NULL */
773 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1045, 0) }, /* NULL */
774 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x104e, 0) }, /* NULL */
775 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x104f, 0) }, /* NULL */
776 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1050, 0) }, /* NULL */
777 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1051, 0) }, /* NULL */
778 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1052, 0) }, /* NULL */
779 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1053, 0) }, /* NULL */
780 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1054, 0) }, /* NULL */
781 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1055, 0) }, /* NULL */
782 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1056, 0) }, /* NULL */
783 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1057, 0) }, /* NULL */
784 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1058, 0) }, /* NULL */
785 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1059, 0) }, /* NULL */
786 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105a, 0) }, /* NULL */
787 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105b, 0) }, /* NULL */
788 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105c, 0) }, /* NULL */
789 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105d, 0) }, /* NULL */
790 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1503, 3) }, /* MOX6/MOX8 */
791 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2000, 0) }, /* DGP-7 */
792 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2001, 0) }, /* DGP-5 */
793 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2002, 0) }, /* NULL */
794 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2003, 0) }, /* NULL */
795 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5000, 0) }, /* CS1D */
796 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5001, 0) }, /* DSP1D */
797 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5002, 0) }, /* DME32 */
798 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5003, 0) }, /* DM2000 */
799 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5004, 0) }, /* 02R96 */
800 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5005, 0) }, /* ACU16-C */
801 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5006, 0) }, /* NHB32-C */
802 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5007, 0) }, /* DM1000 */
803 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5008, 0) }, /* 01V96 */
804 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5009, 0) }, /* SPX2000 */
805 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500a, 0) }, /* PM5D */
806 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500b, 0) }, /* DME64N */
807 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500c, 0) }, /* DME24N */
808 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500d, 0) }, /* NULL */
809 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500e, 0) }, /* NULL */
810 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500f, 0) }, /* NULL */
811 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x7000, 0) }, /* DTX */
812 	{ USB_VPI(USB_VENDOR_YAMAHA, 0x7010, 0) }, /* UB99 */
813 };
814 
815 static const STRUCT_USB_HOST_ID __used uaudio_devs[] = {
816 	/* Generic USB audio class match */
817 	{USB_IFACE_CLASS(UICLASS_AUDIO),
818 	 USB_IFACE_SUBCLASS(UISUBCLASS_AUDIOCONTROL),},
819 	/* Generic USB MIDI class match */
820 	{USB_IFACE_CLASS(UICLASS_AUDIO),
821 	 USB_IFACE_SUBCLASS(UISUBCLASS_MIDISTREAM),},
822 };
823 
824 static int
825 uaudio_probe(device_t dev)
826 {
827 	struct usb_attach_arg *uaa = device_get_ivars(dev);
828 
829 	if (uaa->usb_mode != USB_MODE_HOST)
830 		return (ENXIO);
831 
832 	/* lookup non-standard device(s) */
833 
834 	if (usbd_lookup_id_by_uaa(uaudio_vendor_midi,
835 	    sizeof(uaudio_vendor_midi), uaa) == 0) {
836 		return (BUS_PROBE_SPECIFIC);
837 	}
838 
839 	if (uaa->info.bInterfaceClass != UICLASS_AUDIO) {
840 		if (uaa->info.bInterfaceClass != UICLASS_VENDOR ||
841 		    usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS) == 0)
842 			return (ENXIO);
843 	}
844 
845 	/* check for AUDIO control interface */
846 
847 	if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) {
848 		if (usb_test_quirk(uaa, UQ_BAD_AUDIO))
849 			return (ENXIO);
850 		else
851 			return (BUS_PROBE_GENERIC);
852 	}
853 
854 	/* check for MIDI stream */
855 
856 	if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM) {
857 		if (usb_test_quirk(uaa, UQ_BAD_MIDI))
858 			return (ENXIO);
859 		else
860 			return (BUS_PROBE_GENERIC);
861 	}
862 	return (ENXIO);
863 }
864 
865 static int
866 uaudio_attach(device_t dev)
867 {
868 	struct usb_attach_arg *uaa = device_get_ivars(dev);
869 	struct uaudio_softc *sc = device_get_softc(dev);
870 	struct usb_interface_descriptor *id;
871 	usb_error_t err;
872 	device_t child;
873 
874 	sc->sc_play_chan.priv_sc = sc;
875 	sc->sc_rec_chan.priv_sc = sc;
876 	sc->sc_udev = uaa->device;
877 	sc->sc_mixer_iface_index = uaa->info.bIfaceIndex;
878 	sc->sc_mixer_iface_no = uaa->info.bIfaceNum;
879 	sc->sc_config_msg[0].hdr.pm_callback = &uaudio_configure_msg;
880 	sc->sc_config_msg[0].sc = sc;
881 	sc->sc_config_msg[1].hdr.pm_callback = &uaudio_configure_msg;
882 	sc->sc_config_msg[1].sc = sc;
883 
884 	if (usb_test_quirk(uaa, UQ_AUDIO_SWAP_LR))
885 		sc->sc_uq_audio_swap_lr = 1;
886 
887 	if (usb_test_quirk(uaa, UQ_AU_INP_ASYNC))
888 		sc->sc_uq_au_inp_async = 1;
889 
890 	if (usb_test_quirk(uaa, UQ_AU_NO_XU))
891 		sc->sc_uq_au_no_xu = 1;
892 
893 	if (usb_test_quirk(uaa, UQ_BAD_ADC))
894 		sc->sc_uq_bad_adc = 1;
895 
896 	if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS))
897 		sc->sc_uq_au_vendor_class = 1;
898 
899 	umidi_init(dev);
900 
901 	device_set_usb_desc(dev);
902 
903 	id = usbd_get_interface_descriptor(uaa->iface);
904 
905 	/* must fill mixer info before channel info */
906 	uaudio_mixer_fill_info(sc, uaa->device, id);
907 
908 	/* fill channel info */
909 	uaudio_chan_fill_info(sc, uaa->device);
910 
911 	DPRINTF("audio rev %d.%02x\n",
912 	    sc->sc_audio_rev >> 8,
913 	    sc->sc_audio_rev & 0xff);
914 
915 	if (sc->sc_mixer_count == 0) {
916 		if (uaa->info.idVendor == USB_VENDOR_MAUDIO &&
917 		    (uaa->info.idProduct == USB_PRODUCT_MAUDIO_FASTTRACKULTRA ||
918 		    uaa->info.idProduct == USB_PRODUCT_MAUDIO_FASTTRACKULTRA8R)) {
919 			DPRINTF("Generating mixer descriptors\n");
920 			uaudio_mixer_controls_create_ftu(sc);
921 		}
922 	}
923 
924 	DPRINTF("%d mixer controls\n",
925 	    sc->sc_mixer_count);
926 
927 	if (sc->sc_play_chan.num_alt > 0) {
928 		uint8_t x;
929 
930 		/*
931 		 * Need to set a default alternate interface, else
932 		 * some USB audio devices might go into an infinte
933 		 * re-enumeration loop:
934 		 */
935 		err = usbd_set_alt_interface_index(sc->sc_udev,
936 		    sc->sc_play_chan.usb_alt[0].iface_index,
937 		    sc->sc_play_chan.usb_alt[0].iface_alt_index);
938 		if (err) {
939 			DPRINTF("setting of alternate index failed: %s!\n",
940 			    usbd_errstr(err));
941 		}
942 		for (x = 0; x != sc->sc_play_chan.num_alt; x++) {
943 			device_printf(dev, "Play: %d Hz, %d ch, %s format, "
944 			    "2x8ms buffer.\n",
945 			    sc->sc_play_chan.usb_alt[x].sample_rate,
946 			    sc->sc_play_chan.usb_alt[x].channels,
947 			    sc->sc_play_chan.usb_alt[x].p_fmt->description);
948 		}
949 	} else {
950 		device_printf(dev, "No playback.\n");
951 	}
952 
953 	if (sc->sc_rec_chan.num_alt > 0) {
954 		uint8_t x;
955 
956 		/*
957 		 * Need to set a default alternate interface, else
958 		 * some USB audio devices might go into an infinte
959 		 * re-enumeration loop:
960 		 */
961 		err = usbd_set_alt_interface_index(sc->sc_udev,
962 		    sc->sc_rec_chan.usb_alt[0].iface_index,
963 		    sc->sc_rec_chan.usb_alt[0].iface_alt_index);
964 		if (err) {
965 			DPRINTF("setting of alternate index failed: %s!\n",
966 			    usbd_errstr(err));
967 		}
968 		for (x = 0; x != sc->sc_rec_chan.num_alt; x++) {
969 			device_printf(dev, "Record: %d Hz, %d ch, %s format, "
970 			    "2x8ms buffer.\n",
971 			    sc->sc_rec_chan.usb_alt[x].sample_rate,
972 			    sc->sc_rec_chan.usb_alt[x].channels,
973 			    sc->sc_rec_chan.usb_alt[x].p_fmt->description);
974 		}
975 	} else {
976 		device_printf(dev, "No recording.\n");
977 	}
978 
979 	if (sc->sc_midi_chan.valid == 0) {
980 		if (usbd_lookup_id_by_uaa(uaudio_vendor_midi,
981 		    sizeof(uaudio_vendor_midi), uaa) == 0) {
982 			sc->sc_midi_chan.iface_index =
983 			    (uint8_t)uaa->driver_info;
984 			sc->sc_midi_chan.iface_alt_index = 0;
985 			sc->sc_midi_chan.valid = 1;
986 		}
987 	}
988 
989 	if (sc->sc_midi_chan.valid) {
990 
991 		if (umidi_probe(dev)) {
992 			goto detach;
993 		}
994 		device_printf(dev, "MIDI sequencer.\n");
995 	} else {
996 		device_printf(dev, "No MIDI sequencer.\n");
997 	}
998 
999 	DPRINTF("doing child attach\n");
1000 
1001 	/* attach the children */
1002 
1003 	sc->sc_sndcard_func.func = SCF_PCM;
1004 
1005 	/*
1006 	 * Only attach a PCM device if we have a playback, recording
1007 	 * or mixer device present:
1008 	 */
1009 	if (sc->sc_play_chan.num_alt > 0 ||
1010 	    sc->sc_rec_chan.num_alt > 0 ||
1011 	    sc->sc_mix_info) {
1012 		child = device_add_child(dev, "pcm", -1);
1013 
1014 		if (child == NULL) {
1015 			DPRINTF("out of memory\n");
1016 			goto detach;
1017 		}
1018 		device_set_ivars(child, &sc->sc_sndcard_func);
1019 	}
1020 
1021 	if (bus_generic_attach(dev)) {
1022 		DPRINTF("child attach failed\n");
1023 		goto detach;
1024 	}
1025 
1026 	if (uaudio_hid_probe(sc, uaa) == 0) {
1027 		device_printf(dev, "HID volume keys found.\n");
1028 	} else {
1029 		device_printf(dev, "No HID volume keys found.\n");
1030 	}
1031 
1032 	/* reload all mixer settings */
1033 	uaudio_mixer_reload_all(sc);
1034 
1035 	return (0);			/* success */
1036 
1037 detach:
1038 	uaudio_detach(dev);
1039 	return (ENXIO);
1040 }
1041 
1042 static void
1043 uaudio_pcm_setflags(device_t dev, uint32_t flags)
1044 {
1045 	pcm_setflags(dev, pcm_getflags(dev) | flags);
1046 }
1047 
1048 int
1049 uaudio_attach_sub(device_t dev, kobj_class_t mixer_class, kobj_class_t chan_class)
1050 {
1051 	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
1052 	char status[SND_STATUSLEN];
1053 
1054 	uaudio_mixer_init(sc);
1055 
1056 	if (sc->sc_uq_audio_swap_lr) {
1057 		DPRINTF("hardware has swapped left and right\n");
1058 		/* uaudio_pcm_setflags(dev, SD_F_PSWAPLR); */
1059 	}
1060 	if (!(sc->sc_mix_info & SOUND_MASK_PCM)) {
1061 
1062 		DPRINTF("emulating master volume\n");
1063 
1064 		/*
1065 		 * Emulate missing pcm mixer controller
1066 		 * through FEEDER_VOLUME
1067 		 */
1068 		uaudio_pcm_setflags(dev, SD_F_SOFTPCMVOL);
1069 	}
1070 	if (mixer_init(dev, mixer_class, sc))
1071 		goto detach;
1072 	sc->sc_mixer_init = 1;
1073 
1074 	mixer_hwvol_init(dev);
1075 
1076 	snprintf(status, sizeof(status), "at ? %s", PCM_KLDSTRING(snd_uaudio));
1077 
1078 	if (pcm_register(dev, sc,
1079 	    (sc->sc_play_chan.num_alt > 0) ? 1 : 0,
1080 	    (sc->sc_rec_chan.num_alt > 0) ? 1 : 0)) {
1081 		goto detach;
1082 	}
1083 
1084 	uaudio_pcm_setflags(dev, SD_F_MPSAFE);
1085 	sc->sc_pcm_registered = 1;
1086 
1087 	if (sc->sc_play_chan.num_alt > 0) {
1088 		pcm_addchan(dev, PCMDIR_PLAY, chan_class, sc);
1089 	}
1090 	if (sc->sc_rec_chan.num_alt > 0) {
1091 		pcm_addchan(dev, PCMDIR_REC, chan_class, sc);
1092 	}
1093 	pcm_setstatus(dev, status);
1094 
1095 	uaudio_mixer_register_sysctl(sc, dev);
1096 
1097 	return (0);			/* success */
1098 
1099 detach:
1100 	uaudio_detach_sub(dev);
1101 	return (ENXIO);
1102 }
1103 
1104 int
1105 uaudio_detach_sub(device_t dev)
1106 {
1107 	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
1108 	int error = 0;
1109 
1110 repeat:
1111 	if (sc->sc_pcm_registered) {
1112 		error = pcm_unregister(dev);
1113 	} else {
1114 		if (sc->sc_mixer_init) {
1115 			error = mixer_uninit(dev);
1116 		}
1117 	}
1118 
1119 	if (error) {
1120 		device_printf(dev, "Waiting for sound application to exit!\n");
1121 		usb_pause_mtx(NULL, 2 * hz);
1122 		goto repeat;		/* try again */
1123 	}
1124 	return (0);			/* success */
1125 }
1126 
1127 static int
1128 uaudio_detach(device_t dev)
1129 {
1130 	struct uaudio_softc *sc = device_get_softc(dev);
1131 
1132 	/*
1133 	 * Stop USB transfers early so that any audio applications
1134 	 * will time out and close opened /dev/dspX.Y device(s), if
1135 	 * any.
1136 	 */
1137 	usb_proc_explore_lock(sc->sc_udev);
1138 	sc->sc_play_chan.operation = CHAN_OP_DRAIN;
1139 	sc->sc_rec_chan.operation = CHAN_OP_DRAIN;
1140 	usb_proc_explore_mwait(sc->sc_udev,
1141 	    &sc->sc_config_msg[0], &sc->sc_config_msg[1]);
1142 	usb_proc_explore_unlock(sc->sc_udev);
1143 
1144 	usbd_transfer_unsetup(sc->sc_play_chan.xfer, UAUDIO_NCHANBUFS + 1);
1145 	usbd_transfer_unsetup(sc->sc_rec_chan.xfer, UAUDIO_NCHANBUFS + 1);
1146 
1147 	uaudio_hid_detach(sc);
1148 
1149 	if (bus_generic_detach(dev) != 0) {
1150 		DPRINTF("detach failed!\n");
1151 	}
1152 	sbuf_delete(&sc->sc_sndstat);
1153 	sc->sc_sndstat_valid = 0;
1154 
1155 	umidi_detach(dev);
1156 
1157 	/* free mixer data */
1158 
1159 	uaudio_mixer_ctl_free(sc);
1160 
1161 	return (0);
1162 }
1163 
1164 static uint32_t
1165 uaudio_get_buffer_size(struct uaudio_chan *ch, uint8_t alt)
1166 {
1167 	struct uaudio_chan_alt *chan_alt = &ch->usb_alt[alt];
1168 	/* We use 2 times 8ms of buffer */
1169 	uint32_t buf_size = (((chan_alt->sample_rate * (UAUDIO_NFRAMES / 8)) +
1170 	    1000 - 1) / 1000) * chan_alt->sample_size;
1171 	return (buf_size);
1172 }
1173 
1174 static void
1175 uaudio_configure_msg_sub(struct uaudio_softc *sc,
1176     struct uaudio_chan *chan, int dir)
1177 {
1178 	struct uaudio_chan_alt *chan_alt;
1179 	uint32_t frames;
1180 	uint32_t buf_size;
1181 	uint16_t fps;
1182 	uint8_t set_alt;
1183 	uint8_t fps_shift;
1184 	uint8_t operation;
1185 	usb_error_t err;
1186 
1187 	if (chan->num_alt <= 0)
1188 		return;
1189 
1190 	DPRINTF("\n");
1191 
1192 	usb_proc_explore_lock(sc->sc_udev);
1193 	operation = chan->operation;
1194 	chan->operation = CHAN_OP_NONE;
1195 	usb_proc_explore_unlock(sc->sc_udev);
1196 
1197 	mtx_lock(chan->pcm_mtx);
1198 	if (chan->cur_alt != chan->set_alt)
1199 		set_alt = chan->set_alt;
1200 	else
1201 		set_alt = CHAN_MAX_ALT;
1202 	mtx_unlock(chan->pcm_mtx);
1203 
1204 	if (set_alt >= chan->num_alt)
1205 		goto done;
1206 
1207 	chan_alt = chan->usb_alt + set_alt;
1208 
1209 	usbd_transfer_unsetup(chan->xfer, UAUDIO_NCHANBUFS + 1);
1210 
1211 	err = usbd_set_alt_interface_index(sc->sc_udev,
1212 	    chan_alt->iface_index, chan_alt->iface_alt_index);
1213 	if (err) {
1214 		DPRINTF("setting of alternate index failed: %s!\n",
1215 		    usbd_errstr(err));
1216 		goto error;
1217 	}
1218 
1219 	/*
1220 	 * Only set the sample rate if the channel reports that it
1221 	 * supports the frequency control.
1222 	 */
1223 
1224 	if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
1225 		/* FALLTHROUGH */
1226 	} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
1227 		unsigned int x;
1228 
1229 		for (x = 0; x != 256; x++) {
1230 			if (dir == PCMDIR_PLAY) {
1231 				if (!(sc->sc_mixer_clocks.bit_output[x / 8] &
1232 				    (1 << (x % 8)))) {
1233 					continue;
1234 				}
1235 			} else {
1236 				if (!(sc->sc_mixer_clocks.bit_input[x / 8] &
1237 				    (1 << (x % 8)))) {
1238 					continue;
1239 				}
1240 			}
1241 
1242 			if (uaudio20_set_speed(sc->sc_udev,
1243 			    sc->sc_mixer_iface_no, x, chan_alt->sample_rate)) {
1244 				/*
1245 				 * If the endpoint is adaptive setting
1246 				 * the speed may fail.
1247 				 */
1248 				DPRINTF("setting of sample rate failed! "
1249 				    "(continuing anyway)\n");
1250 			}
1251 		}
1252 	} else if (chan_alt->p_sed.v1->bmAttributes & UA_SED_FREQ_CONTROL) {
1253 		if (uaudio_set_speed(sc->sc_udev,
1254 		    chan_alt->p_ed1->bEndpointAddress, chan_alt->sample_rate)) {
1255 			/*
1256 			 * If the endpoint is adaptive setting the
1257 			 * speed may fail.
1258 			 */
1259 			DPRINTF("setting of sample rate failed! "
1260 			    "(continuing anyway)\n");
1261 		}
1262 	}
1263 	if (usbd_transfer_setup(sc->sc_udev, &chan_alt->iface_index, chan->xfer,
1264 	    chan_alt->usb_cfg, UAUDIO_NCHANBUFS + 1, chan, chan->pcm_mtx)) {
1265 		DPRINTF("could not allocate USB transfers!\n");
1266 		goto error;
1267 	}
1268 
1269 	fps = usbd_get_isoc_fps(sc->sc_udev);
1270 
1271 	if (fps < 8000) {
1272 		/* FULL speed USB */
1273 		frames = 8;
1274 	} else {
1275 		/* HIGH speed USB */
1276 		frames = UAUDIO_NFRAMES;
1277 	}
1278 
1279 	fps_shift = usbd_xfer_get_fps_shift(chan->xfer[0]);
1280 
1281 	/* down shift number of frames per second, if any */
1282 	fps >>= fps_shift;
1283 	frames >>= fps_shift;
1284 
1285 	/* bytes per frame should not be zero */
1286 	chan->bytes_per_frame[0] =
1287 	    ((chan_alt->sample_rate / fps) * chan_alt->sample_size);
1288 	chan->bytes_per_frame[1] =
1289 	    (((chan_alt->sample_rate + fps - 1) / fps) * chan_alt->sample_size);
1290 
1291 	/* setup data rate dithering, if any */
1292 	chan->frames_per_second = fps;
1293 	chan->sample_rem = chan_alt->sample_rate % fps;
1294 	chan->sample_curr = 0;
1295 	chan->frames_per_second = fps;
1296 
1297 	/* compute required buffer size */
1298 	buf_size = (chan->bytes_per_frame[1] * frames);
1299 
1300 	if (buf_size > (chan->end - chan->start)) {
1301 		DPRINTF("buffer size is too big\n");
1302 		goto error;
1303 	}
1304 
1305 	chan->intr_frames = frames;
1306 
1307 	DPRINTF("fps=%d sample_rem=%d\n", (int)fps, (int)chan->sample_rem);
1308 
1309 	if (chan->intr_frames == 0) {
1310 		DPRINTF("frame shift is too high!\n");
1311 		goto error;
1312 	}
1313 
1314 	mtx_lock(chan->pcm_mtx);
1315 	chan->cur_alt = set_alt;
1316 	mtx_unlock(chan->pcm_mtx);
1317 
1318 done:
1319 #if (UAUDIO_NCHANBUFS != 2)
1320 #error "please update code"
1321 #endif
1322 	switch (operation) {
1323 	case CHAN_OP_START:
1324 		mtx_lock(chan->pcm_mtx);
1325 		usbd_transfer_start(chan->xfer[0]);
1326 		usbd_transfer_start(chan->xfer[1]);
1327 		mtx_unlock(chan->pcm_mtx);
1328 		break;
1329 	case CHAN_OP_STOP:
1330 		mtx_lock(chan->pcm_mtx);
1331 		usbd_transfer_stop(chan->xfer[0]);
1332 		usbd_transfer_stop(chan->xfer[1]);
1333 		mtx_unlock(chan->pcm_mtx);
1334 		break;
1335 	default:
1336 		break;
1337 	}
1338 	return;
1339 
1340 error:
1341 	usbd_transfer_unsetup(chan->xfer, UAUDIO_NCHANBUFS + 1);
1342 
1343 	mtx_lock(chan->pcm_mtx);
1344 	chan->cur_alt = CHAN_MAX_ALT;
1345 	mtx_unlock(chan->pcm_mtx);
1346 }
1347 
1348 static void
1349 uaudio_configure_msg(struct usb_proc_msg *pm)
1350 {
1351 	struct uaudio_softc *sc = ((struct uaudio_configure_msg *)pm)->sc;
1352 
1353 	usb_proc_explore_unlock(sc->sc_udev);
1354 	uaudio_configure_msg_sub(sc, &sc->sc_play_chan, PCMDIR_PLAY);
1355 	uaudio_configure_msg_sub(sc, &sc->sc_rec_chan, PCMDIR_REC);
1356 	usb_proc_explore_lock(sc->sc_udev);
1357 }
1358 
1359 /*========================================================================*
1360  * AS - Audio Stream - routines
1361  *========================================================================*/
1362 
1363 #ifdef USB_DEBUG
1364 static void
1365 uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed)
1366 {
1367 	if (ed) {
1368 		DPRINTF("endpoint=%p bLength=%d bDescriptorType=%d \n"
1369 		    "bEndpointAddress=%d bmAttributes=0x%x \n"
1370 		    "wMaxPacketSize=%d bInterval=%d \n"
1371 		    "bRefresh=%d bSynchAddress=%d\n",
1372 		    ed, ed->bLength, ed->bDescriptorType,
1373 		    ed->bEndpointAddress, ed->bmAttributes,
1374 		    UGETW(ed->wMaxPacketSize), ed->bInterval,
1375 		    UEP_HAS_REFRESH(ed) ? ed->bRefresh : 0,
1376 		    UEP_HAS_SYNCADDR(ed) ? ed->bSynchAddress : 0);
1377 	}
1378 }
1379 
1380 #endif
1381 
1382 /*
1383  * The following is a workaround for broken no-name USB audio devices
1384  * sold by dealextreme called "3D sound". The problem is that the
1385  * manufacturer computed wMaxPacketSize is too small to hold the
1386  * actual data sent. In other words the device sometimes sends more
1387  * data than it actually reports it can send in a single isochronous
1388  * packet.
1389  */
1390 static void
1391 uaudio_record_fix_fs(usb_endpoint_descriptor_audio_t *ep,
1392     uint32_t xps, uint32_t add)
1393 {
1394 	uint32_t mps;
1395 
1396 	mps = UGETW(ep->wMaxPacketSize);
1397 
1398 	/*
1399 	 * If the device indicates it can send more data than what the
1400 	 * sample rate indicates, we apply the workaround.
1401 	 */
1402 	if (mps > xps) {
1403 
1404 		/* allow additional data */
1405 		xps += add;
1406 
1407 		/* check against the maximum USB 1.x length */
1408 		if (xps > 1023)
1409 			xps = 1023;
1410 
1411 		/* check if we should do an update */
1412 		if (mps < xps) {
1413 			/* simply update the wMaxPacketSize field */
1414 			USETW(ep->wMaxPacketSize, xps);
1415 			DPRINTF("Workaround: Updated wMaxPacketSize "
1416 			    "from %d to %d bytes.\n",
1417 			    (int)mps, (int)xps);
1418 		}
1419 	}
1420 }
1421 
1422 static usb_error_t
1423 uaudio20_check_rate(struct usb_device *udev, uint8_t iface_no,
1424     uint8_t clockid, uint32_t rate)
1425 {
1426 	struct usb_device_request req;
1427 	usb_error_t error;
1428 	uint8_t data[255];
1429 	uint16_t actlen;
1430 	uint16_t rates;
1431 	uint16_t x;
1432 
1433 	DPRINTFN(6, "ifaceno=%d clockid=%d rate=%u\n",
1434 	    iface_no, clockid, rate);
1435 
1436 	req.bmRequestType = UT_READ_CLASS_INTERFACE;
1437 	req.bRequest = UA20_CS_RANGE;
1438 	USETW2(req.wValue, UA20_CS_SAM_FREQ_CONTROL, 0);
1439 	USETW2(req.wIndex, clockid, iface_no);
1440 	USETW(req.wLength, 255);
1441 
1442         error = usbd_do_request_flags(udev, NULL, &req, data,
1443 	    USB_SHORT_XFER_OK, &actlen, USB_DEFAULT_TIMEOUT);
1444 
1445 	if (error != 0 || actlen < 2)
1446 		return (USB_ERR_INVAL);
1447 
1448 	rates = data[0] | (data[1] << 8);
1449 	actlen = (actlen - 2) / 12;
1450 
1451 	if (rates > actlen) {
1452 		DPRINTF("Too many rates\n");
1453 		rates = actlen;
1454 	}
1455 
1456 	for (x = 0; x != rates; x++) {
1457 		uint32_t min = UGETDW(data + 2 + (12 * x));
1458 		uint32_t max = UGETDW(data + 6 + (12 * x));
1459 		uint32_t res = UGETDW(data + 10 + (12 * x));
1460 
1461 		if (res == 0) {
1462 			DPRINTF("Zero residue\n");
1463 			res = 1;
1464 		}
1465 
1466 		if (min > max) {
1467 			DPRINTF("Swapped max and min\n");
1468 			uint32_t temp;
1469 			temp = min;
1470 			min = max;
1471 			max = temp;
1472 		}
1473 
1474 		if (rate >= min && rate <= max &&
1475 		    (((rate - min) % res) == 0)) {
1476 			return (0);
1477 		}
1478 	}
1479 	return (USB_ERR_INVAL);
1480 }
1481 
1482 static void
1483 uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
1484     uint32_t rate, uint8_t channels, uint8_t bit_resolution)
1485 {
1486 	struct usb_descriptor *desc = NULL;
1487 	union uaudio_asid asid = { NULL };
1488 	union uaudio_asf1d asf1d = { NULL };
1489 	union uaudio_sed sed = { NULL };
1490 	usb_endpoint_descriptor_audio_t *ed1 = NULL;
1491 	const struct usb_audio_control_descriptor *acdp = NULL;
1492 	struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
1493 	struct usb_interface_descriptor *id;
1494 	const struct uaudio_format *p_fmt = NULL;
1495 	struct uaudio_chan *chan;
1496 	struct uaudio_chan_alt *chan_alt;
1497 	uint32_t format;
1498 	uint16_t curidx = 0xFFFF;
1499 	uint16_t lastidx = 0xFFFF;
1500 	uint16_t alt_index = 0;
1501 	uint16_t audio_rev = 0;
1502 	uint16_t x;
1503 	uint8_t ep_dir;
1504 	uint8_t bChannels;
1505 	uint8_t bBitResolution;
1506 	uint8_t audio_if = 0;
1507 	uint8_t uma_if_class;
1508 
1509 	while ((desc = usb_desc_foreach(cd, desc))) {
1510 
1511 		if ((desc->bDescriptorType == UDESC_INTERFACE) &&
1512 		    (desc->bLength >= sizeof(*id))) {
1513 
1514 			id = (void *)desc;
1515 
1516 			if (id->bInterfaceNumber != lastidx) {
1517 				lastidx = id->bInterfaceNumber;
1518 				curidx++;
1519 				alt_index = 0;
1520 
1521 			} else {
1522 				alt_index++;
1523 			}
1524 
1525 			if ((!(sc->sc_hid.flags & UAUDIO_HID_VALID)) &&
1526 			    (id->bInterfaceClass == UICLASS_HID) &&
1527 			    (id->bInterfaceSubClass == 0) &&
1528 			    (id->bInterfaceProtocol == 0) &&
1529 			    (alt_index == 0) &&
1530 			    usbd_get_iface(udev, curidx) != NULL) {
1531 				DPRINTF("Found HID interface at %d\n",
1532 				    curidx);
1533 				sc->sc_hid.flags |= UAUDIO_HID_VALID;
1534 				sc->sc_hid.iface_index = curidx;
1535 			}
1536 
1537 			uma_if_class =
1538 			    ((id->bInterfaceClass == UICLASS_AUDIO) ||
1539 			    ((id->bInterfaceClass == UICLASS_VENDOR) &&
1540 			    (sc->sc_uq_au_vendor_class != 0)));
1541 
1542 			if ((uma_if_class != 0) && (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
1543 				audio_if = 1;
1544 			} else {
1545 				audio_if = 0;
1546 			}
1547 
1548 			if ((uma_if_class != 0) &&
1549 			    (id->bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
1550 
1551 				/*
1552 				 * XXX could allow multiple MIDI interfaces
1553 				 */
1554 
1555 				if ((sc->sc_midi_chan.valid == 0) &&
1556 				    usbd_get_iface(udev, curidx)) {
1557 					sc->sc_midi_chan.iface_index = curidx;
1558 					sc->sc_midi_chan.iface_alt_index = alt_index;
1559 					sc->sc_midi_chan.valid = 1;
1560 				}
1561 			}
1562 			asid.v1 = NULL;
1563 			asf1d.v1 = NULL;
1564 			ed1 = NULL;
1565 			sed.v1 = NULL;
1566 		}
1567 
1568 		if (audio_if == 0) {
1569 			if ((acdp == NULL) &&
1570 			    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
1571 			    (desc->bDescriptorSubtype == UDESCSUB_AC_HEADER) &&
1572 			    (desc->bLength >= sizeof(*acdp))) {
1573 				acdp = (void *)desc;
1574 				audio_rev = UGETW(acdp->bcdADC);
1575 			}
1576 
1577 			/*
1578 			 * Don't collect any USB audio descriptors if
1579 			 * this is not an USB audio stream interface.
1580 			 */
1581 			continue;
1582 		}
1583 
1584 		if ((acdp != NULL) &&
1585 		    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
1586 		    (desc->bDescriptorSubtype == AS_GENERAL) &&
1587 		    (asid.v1 == NULL)) {
1588 			if (audio_rev >= UAUDIO_VERSION_30) {
1589 				/* FALLTHROUGH */
1590 			} else if (audio_rev >= UAUDIO_VERSION_20) {
1591 				if (desc->bLength >= sizeof(*asid.v2)) {
1592 					asid.v2 = (void *)desc;
1593 				}
1594 			} else {
1595 				if (desc->bLength >= sizeof(*asid.v1)) {
1596 					asid.v1 = (void *)desc;
1597 				}
1598 			}
1599 		}
1600 		if ((acdp != NULL) &&
1601 		    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
1602 		    (desc->bDescriptorSubtype == FORMAT_TYPE) &&
1603 		    (asf1d.v1 == NULL)) {
1604 			if (audio_rev >= UAUDIO_VERSION_30) {
1605 				/* FALLTHROUGH */
1606 			} else if (audio_rev >= UAUDIO_VERSION_20) {
1607 				if (desc->bLength >= sizeof(*asf1d.v2))
1608 					asf1d.v2 = (void *)desc;
1609 			} else {
1610 				if (desc->bLength >= sizeof(*asf1d.v1)) {
1611 					asf1d.v1 = (void *)desc;
1612 
1613 					if (asf1d.v1->bFormatType != FORMAT_TYPE_I) {
1614 						DPRINTFN(11, "ignored bFormatType = %d\n",
1615 						    asf1d.v1->bFormatType);
1616 						asf1d.v1 = NULL;
1617 						continue;
1618 					}
1619 					if (desc->bLength < (sizeof(*asf1d.v1) +
1620 					    ((asf1d.v1->bSamFreqType == 0) ? 6 :
1621 					    (asf1d.v1->bSamFreqType * 3)))) {
1622 						DPRINTFN(11, "invalid descriptor, "
1623 						    "too short\n");
1624 						asf1d.v1 = NULL;
1625 						continue;
1626 					}
1627 				}
1628 			}
1629 		}
1630 		if ((desc->bDescriptorType == UDESC_ENDPOINT) &&
1631 		    (desc->bLength >= UEP_MINSIZE) &&
1632 		    (ed1 == NULL)) {
1633 			ed1 = (void *)desc;
1634 			if (UE_GET_XFERTYPE(ed1->bmAttributes) != UE_ISOCHRONOUS) {
1635 				ed1 = NULL;
1636 				continue;
1637 			}
1638 		}
1639 		if ((acdp != NULL) &&
1640 		    (desc->bDescriptorType == UDESC_CS_ENDPOINT) &&
1641 		    (desc->bDescriptorSubtype == AS_GENERAL) &&
1642 		    (sed.v1 == NULL)) {
1643 			if (audio_rev >= UAUDIO_VERSION_30) {
1644 				/* FALLTHROUGH */
1645 			} else if (audio_rev >= UAUDIO_VERSION_20) {
1646 				if (desc->bLength >= sizeof(*sed.v2))
1647 					sed.v2 = (void *)desc;
1648 			} else {
1649 				if (desc->bLength >= sizeof(*sed.v1))
1650 					sed.v1 = (void *)desc;
1651 			}
1652 		}
1653 		if (asid.v1 == NULL || asf1d.v1 == NULL ||
1654 		    ed1 == NULL || sed.v1 == NULL) {
1655 			/* need more descriptors */
1656 			continue;
1657 		}
1658 
1659 		ep_dir = UE_GET_DIR(ed1->bEndpointAddress);
1660 
1661 		/* We ignore sync endpoint information until further. */
1662 
1663 		if (audio_rev >= UAUDIO_VERSION_30) {
1664 			goto next_ep;
1665 		} else if (audio_rev >= UAUDIO_VERSION_20) {
1666 
1667 			uint32_t dwFormat;
1668 			uint8_t bSubslotSize;
1669 
1670 			dwFormat = UGETDW(asid.v2->bmFormats);
1671 			bChannels = asid.v2->bNrChannels;
1672 			bBitResolution = asf1d.v2->bBitResolution;
1673 			bSubslotSize = asf1d.v2->bSubslotSize;
1674 
1675 			/* Map 4-byte aligned 24-bit samples into 32-bit */
1676 			if (bBitResolution == 24 && bSubslotSize == 4)
1677 				bBitResolution = 32;
1678 
1679 			if (bBitResolution != (bSubslotSize * 8)) {
1680 				DPRINTF("Invalid bSubslotSize\n");
1681 				goto next_ep;
1682 			}
1683 
1684 			if ((bChannels != channels) ||
1685 			    (bBitResolution != bit_resolution)) {
1686 				DPRINTF("Wrong number of channels\n");
1687 				goto next_ep;
1688 			}
1689 
1690 			for (p_fmt = uaudio20_formats;
1691 			    p_fmt->wFormat != 0; p_fmt++) {
1692 				if ((p_fmt->wFormat & dwFormat) &&
1693 				    (p_fmt->bPrecision == bBitResolution))
1694 					break;
1695 			}
1696 
1697 			if (p_fmt->wFormat == 0) {
1698 				DPRINTF("Unsupported audio format\n");
1699 				goto next_ep;
1700 			}
1701 
1702 			for (x = 0; x != 256; x++) {
1703 				if (ep_dir == UE_DIR_OUT) {
1704 					if (!(sc->sc_mixer_clocks.bit_output[x / 8] &
1705 					    (1 << (x % 8)))) {
1706 						continue;
1707 					}
1708 				} else {
1709 					if (!(sc->sc_mixer_clocks.bit_input[x / 8] &
1710 					    (1 << (x % 8)))) {
1711 						continue;
1712 					}
1713 				}
1714 
1715 				DPRINTF("Checking clock ID=%d\n", x);
1716 
1717 				if (uaudio20_check_rate(udev,
1718 				    sc->sc_mixer_iface_no, x, rate)) {
1719 					DPRINTF("Unsupported sampling "
1720 					    "rate, id=%d\n", x);
1721 					goto next_ep;
1722 				}
1723 			}
1724 		} else {
1725 			uint16_t wFormat;
1726 
1727 			wFormat = UGETW(asid.v1->wFormatTag);
1728 			bChannels = UAUDIO_MAX_CHAN(asf1d.v1->bNrChannels);
1729 			bBitResolution = asf1d.v1->bBitResolution;
1730 
1731 			if (asf1d.v1->bSamFreqType == 0) {
1732 				DPRINTFN(16, "Sample rate: %d-%dHz\n",
1733 				    UA_SAMP_LO(asf1d.v1),
1734 				    UA_SAMP_HI(asf1d.v1));
1735 
1736 				if ((rate >= UA_SAMP_LO(asf1d.v1)) &&
1737 				    (rate <= UA_SAMP_HI(asf1d.v1)))
1738 					goto found_rate;
1739 			} else {
1740 
1741 				for (x = 0; x < asf1d.v1->bSamFreqType; x++) {
1742 					DPRINTFN(16, "Sample rate = %dHz\n",
1743 					    UA_GETSAMP(asf1d.v1, x));
1744 
1745 					if (rate == UA_GETSAMP(asf1d.v1, x))
1746 						goto found_rate;
1747 				}
1748 			}
1749 			goto next_ep;
1750 
1751 	found_rate:
1752 			for (p_fmt = uaudio10_formats;
1753 			    p_fmt->wFormat != 0; p_fmt++) {
1754 				if ((p_fmt->wFormat == wFormat) &&
1755 				    (p_fmt->bPrecision == bBitResolution))
1756 					break;
1757 			}
1758 			if (p_fmt->wFormat == 0) {
1759 				DPRINTF("Unsupported audio format\n");
1760 				goto next_ep;
1761 			}
1762 
1763 			if ((bChannels != channels) ||
1764 			    (bBitResolution != bit_resolution)) {
1765 				DPRINTF("Wrong number of channels\n");
1766 				goto next_ep;
1767 			}
1768 		}
1769 
1770 		chan = (ep_dir == UE_DIR_IN) ?
1771 		    &sc->sc_rec_chan : &sc->sc_play_chan;
1772 
1773 		if (usbd_get_iface(udev, curidx) == NULL) {
1774 			DPRINTF("Interface is not valid\n");
1775 			goto next_ep;
1776 		}
1777 		if (chan->num_alt == CHAN_MAX_ALT) {
1778 			DPRINTF("Too many alternate settings\n");
1779 			goto next_ep;
1780 		}
1781 		chan->set_alt = 0;
1782 		chan->cur_alt = CHAN_MAX_ALT;
1783 
1784 		chan_alt = &chan->usb_alt[chan->num_alt++];
1785 
1786 #ifdef USB_DEBUG
1787 		uaudio_chan_dump_ep_desc(ed1);
1788 #endif
1789 		DPRINTF("Sample rate = %dHz, channels = %d, "
1790 		    "bits = %d, format = %s\n", rate, channels,
1791 		    bit_resolution, p_fmt->description);
1792 
1793 		chan_alt->sample_rate = rate;
1794 		chan_alt->p_asf1d = asf1d;
1795 		chan_alt->p_ed1 = ed1;
1796 		chan_alt->p_fmt = p_fmt;
1797 		chan_alt->p_sed = sed;
1798 		chan_alt->iface_index = curidx;
1799 		chan_alt->iface_alt_index = alt_index;
1800 
1801 		usbd_set_parent_iface(sc->sc_udev, curidx,
1802 		    sc->sc_mixer_iface_index);
1803 
1804 		if (ep_dir == UE_DIR_IN)
1805 			chan_alt->usb_cfg = uaudio_cfg_record;
1806 		else
1807 			chan_alt->usb_cfg = uaudio_cfg_play;
1808 
1809 		chan_alt->sample_size = (UAUDIO_MAX_CHAN(channels) *
1810 		    p_fmt->bPrecision) / 8;
1811 		chan_alt->channels = channels;
1812 
1813 		if (ep_dir == UE_DIR_IN &&
1814 		    usbd_get_speed(udev) == USB_SPEED_FULL) {
1815 			uaudio_record_fix_fs(ed1,
1816 			    chan_alt->sample_size * (rate / 1000),
1817 			    chan_alt->sample_size * (rate / 4000));
1818 		}
1819 
1820 		/* setup play/record format */
1821 
1822 		format = chan_alt->p_fmt->freebsd_fmt;
1823 
1824 		switch (chan_alt->channels) {
1825 		case 2:
1826 			/* stereo */
1827 			format = SND_FORMAT(format, 2, 0);
1828 			break;
1829 		case 1:
1830 			/* mono */
1831 			format = SND_FORMAT(format, 1, 0);
1832 			break;
1833 		default:
1834 			/* surround and more */
1835 			format = feeder_matrix_default_format(
1836 			    SND_FORMAT(format, chan_alt->channels, 0));
1837 			break;
1838 		}
1839 
1840 		/* check if format is not supported */
1841 		if (format == 0) {
1842 			DPRINTF("The selected audio format is not supported\n");
1843 			chan->num_alt--;
1844 			goto next_ep;
1845 		}
1846 		if (chan->num_alt > 1) {
1847 			/* we only accumulate one format at different sample rates */
1848 			if (chan->pcm_format[0] != format) {
1849 				DPRINTF("Multiple formats is not supported\n");
1850 				chan->num_alt--;
1851 				goto next_ep;
1852 			}
1853 			/* ignore if duplicate sample rate entry */
1854 			if (rate == chan->usb_alt[chan->num_alt - 2].sample_rate) {
1855 				DPRINTF("Duplicate sample rate detected\n");
1856 				chan->num_alt--;
1857 				goto next_ep;
1858 			}
1859 		}
1860 		chan->pcm_cap.fmtlist = chan->pcm_format;
1861 		chan->pcm_cap.fmtlist[0] = format;
1862 
1863 		if (rate < chan->pcm_cap.minspeed || chan->pcm_cap.minspeed == 0)
1864 			chan->pcm_cap.minspeed = rate;
1865 		if (rate > chan->pcm_cap.maxspeed || chan->pcm_cap.maxspeed == 0)
1866 			chan->pcm_cap.maxspeed = rate;
1867 
1868 		if (sc->sc_sndstat_valid != 0) {
1869 			sbuf_printf(&sc->sc_sndstat, "\n\t"
1870 			    "mode %d.%d:(%s) %dch, %dbit, %s, %dHz",
1871 			    curidx, alt_index,
1872 			    (ep_dir == UE_DIR_IN) ? "input" : "output",
1873 				    channels, p_fmt->bPrecision,
1874 				    p_fmt->description, rate);
1875 		}
1876 
1877 	next_ep:
1878 		sed.v1 = NULL;
1879 		ed1 = NULL;
1880 	}
1881 }
1882 
1883 /* This structure defines all the supported rates. */
1884 
1885 static const uint32_t uaudio_rate_list[CHAN_MAX_ALT] = {
1886 	96000,
1887 	88200,
1888 	88000,
1889 	80000,
1890 	72000,
1891 	64000,
1892 	56000,
1893 	48000,
1894 	44100,
1895 	40000,
1896 	32000,
1897 	24000,
1898 	22050,
1899 	16000,
1900 	11025,
1901 	8000,
1902 	0
1903 };
1904 
1905 static void
1906 uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev)
1907 {
1908 	uint32_t rate = uaudio_default_rate;
1909 	uint8_t z;
1910 	uint8_t bits = uaudio_default_bits;
1911 	uint8_t y;
1912 	uint8_t channels = uaudio_default_channels;
1913 	uint8_t x;
1914 
1915 	bits -= (bits % 8);
1916 	if ((bits == 0) || (bits > 32)) {
1917 		/* set a valid value */
1918 		bits = 32;
1919 	}
1920 	if (channels == 0) {
1921 		switch (usbd_get_speed(udev)) {
1922 		case USB_SPEED_LOW:
1923 		case USB_SPEED_FULL:
1924 			/*
1925 			 * Due to high bandwidth usage and problems
1926 			 * with HIGH-speed split transactions we
1927 			 * disable surround setups on FULL-speed USB
1928 			 * by default
1929 			 */
1930 			channels = 4;
1931 			break;
1932 		default:
1933 			channels = 16;
1934 			break;
1935 		}
1936 	} else if (channels > 16) {
1937 		channels = 16;
1938 	}
1939 	if (sbuf_new(&sc->sc_sndstat, NULL, 4096, SBUF_AUTOEXTEND)) {
1940 		sc->sc_sndstat_valid = 1;
1941 	}
1942 	/* try to search for a valid config */
1943 
1944 	for (x = channels; x; x--) {
1945 		for (y = bits; y; y -= 8) {
1946 
1947 			/* try user defined rate, if any */
1948 			if (rate != 0)
1949 				uaudio_chan_fill_info_sub(sc, udev, rate, x, y);
1950 
1951 			/* try find a matching rate, if any */
1952 			for (z = 0; uaudio_rate_list[z]; z++)
1953 				uaudio_chan_fill_info_sub(sc, udev, uaudio_rate_list[z], x, y);
1954 		}
1955 	}
1956 	if (sc->sc_sndstat_valid)
1957 		sbuf_finish(&sc->sc_sndstat);
1958 }
1959 
1960 static void
1961 uaudio_chan_play_sync_callback(struct usb_xfer *xfer, usb_error_t error)
1962 {
1963 	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
1964 	struct usb_page_cache *pc;
1965 	uint64_t sample_rate = ch->usb_alt[ch->cur_alt].sample_rate;
1966 	uint8_t buf[4];
1967 	uint64_t temp;
1968 	int len;
1969 	int actlen;
1970 	int nframes;
1971 
1972 	usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
1973 
1974 	switch (USB_GET_STATE(xfer)) {
1975 	case USB_ST_TRANSFERRED:
1976 
1977 		DPRINTFN(6, "transferred %d bytes\n", actlen);
1978 
1979 		if (nframes == 0)
1980 			break;
1981 		len = usbd_xfer_frame_len(xfer, 0);
1982 		if (len == 0)
1983 			break;
1984 		if (len > sizeof(buf))
1985 			len = sizeof(buf);
1986 
1987 		memset(buf, 0, sizeof(buf));
1988 
1989 		pc = usbd_xfer_get_frame(xfer, 0);
1990 		usbd_copy_out(pc, 0, buf, len);
1991 
1992 		temp = UGETDW(buf);
1993 
1994 		DPRINTF("Value = 0x%08x\n", (int)temp);
1995 
1996 		/* auto-detect SYNC format */
1997 
1998 		if (len == 4)
1999 			temp &= 0x0fffffff;
2000 
2001 		/* check for no data */
2002 
2003 		if (temp == 0)
2004 			break;
2005 
2006 		/* correctly scale value */
2007 
2008 		temp = (temp * 125ULL) - 64;
2009 
2010 		/* auto adjust */
2011 
2012 		while (temp < (sample_rate - (sample_rate / 4)))
2013 			temp *= 2;
2014 
2015 		while (temp > (sample_rate + (sample_rate / 2)))
2016 			temp /= 2;
2017 
2018 		/* compare */
2019 
2020 		DPRINTF("Comparing %d < %d\n",
2021 		    (int)temp, (int)sample_rate);
2022 
2023 		if (temp == sample_rate)
2024 			ch->last_sync_state = UAUDIO_SYNC_NONE;
2025 		else if (temp > sample_rate)
2026 			ch->last_sync_state = UAUDIO_SYNC_MORE;
2027 		else
2028 			ch->last_sync_state = UAUDIO_SYNC_LESS;
2029 		break;
2030 
2031 	case USB_ST_SETUP:
2032 		usbd_xfer_set_frames(xfer, 1);
2033 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_framelen(xfer));
2034 		usbd_transfer_submit(xfer);
2035 		break;
2036 
2037 	default:			/* Error */
2038 		break;
2039 	}
2040 }
2041 
2042 static void
2043 uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error)
2044 {
2045 	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
2046 	struct usb_page_cache *pc;
2047 	uint32_t sample_size = ch->usb_alt[ch->cur_alt].sample_size;
2048 	uint32_t mfl;
2049 	uint32_t total;
2050 	uint32_t blockcount;
2051 	uint32_t n;
2052 	uint32_t offset;
2053 	int actlen;
2054 	int sumlen;
2055 
2056 	usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
2057 
2058 	if (ch->end == ch->start) {
2059 		DPRINTF("no buffer!\n");
2060 		return;
2061 	}
2062 
2063 	switch (USB_GET_STATE(xfer)) {
2064 	case USB_ST_TRANSFERRED:
2065 tr_transferred:
2066 		if (actlen < sumlen) {
2067 			DPRINTF("short transfer, "
2068 			    "%d of %d bytes\n", actlen, sumlen);
2069 		}
2070 		chn_intr(ch->pcm_ch);
2071 
2072 		/* start SYNC transfer, if any */
2073 		if ((ch->last_sync_time++ & 7) == 0)
2074 			usbd_transfer_start(ch->xfer[UAUDIO_NCHANBUFS]);
2075 
2076 	case USB_ST_SETUP:
2077 		mfl = usbd_xfer_max_framelen(xfer);
2078 
2079 		if (ch->bytes_per_frame[1] > mfl) {
2080 			DPRINTF("bytes per transfer, %d, "
2081 			    "exceeds maximum, %d!\n",
2082 			    ch->bytes_per_frame[1],
2083 			    mfl);
2084 			break;
2085 		}
2086 
2087 		blockcount = ch->intr_frames;
2088 
2089 		/* setup number of frames */
2090 		usbd_xfer_set_frames(xfer, blockcount);
2091 
2092 		/* reset total length */
2093 		total = 0;
2094 
2095 		/* setup frame lengths */
2096 		for (n = 0; n != blockcount; n++) {
2097 			uint32_t frame_len;
2098 
2099 			ch->sample_curr += ch->sample_rem;
2100 			if (ch->sample_curr >= ch->frames_per_second) {
2101 				ch->sample_curr -= ch->frames_per_second;
2102 				frame_len = ch->bytes_per_frame[1];
2103 			} else {
2104 				frame_len = ch->bytes_per_frame[0];
2105 			}
2106 
2107 			if (n == (blockcount - 1)) {
2108 				switch (ch->last_sync_state) {
2109 				case UAUDIO_SYNC_MORE:
2110 					DPRINTFN(6, "sending one sample more\n");
2111 					if ((frame_len + sample_size) <= mfl)
2112 						frame_len += sample_size;
2113 					ch->last_sync_state = UAUDIO_SYNC_NONE;
2114 					break;
2115 				case UAUDIO_SYNC_LESS:
2116 					DPRINTFN(6, "sending one sample less\n");
2117 					if (frame_len >= sample_size)
2118 						frame_len -= sample_size;
2119 					ch->last_sync_state = UAUDIO_SYNC_NONE;
2120 					break;
2121 				default:
2122 					break;
2123 				}
2124 			}
2125 
2126 			usbd_xfer_set_frame_len(xfer, n, frame_len);
2127 			total += frame_len;
2128 		}
2129 
2130 		DPRINTFN(6, "transfer %d bytes\n", total);
2131 
2132 		offset = 0;
2133 
2134 		pc = usbd_xfer_get_frame(xfer, 0);
2135 		while (total > 0) {
2136 
2137 			n = (ch->end - ch->cur);
2138 			if (n > total) {
2139 				n = total;
2140 			}
2141 			usbd_copy_in(pc, offset, ch->cur, n);
2142 
2143 			total -= n;
2144 			ch->cur += n;
2145 			offset += n;
2146 
2147 			if (ch->cur >= ch->end) {
2148 				ch->cur = ch->start;
2149 			}
2150 		}
2151 
2152 		usbd_transfer_submit(xfer);
2153 		break;
2154 
2155 	default:			/* Error */
2156 		if (error == USB_ERR_CANCELLED) {
2157 			break;
2158 		}
2159 		goto tr_transferred;
2160 	}
2161 }
2162 
2163 static void
2164 uaudio_chan_record_sync_callback(struct usb_xfer *xfer, usb_error_t error)
2165 {
2166 	/* TODO */
2167 }
2168 
2169 static void
2170 uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error)
2171 {
2172 	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
2173 	struct usb_page_cache *pc;
2174 	uint32_t offset0;
2175 	uint32_t offset1;
2176 	uint32_t mfl;
2177 	int m;
2178 	int n;
2179 	int len;
2180 	int actlen;
2181 	int nframes;
2182 	int blockcount;
2183 
2184 	usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
2185 	mfl = usbd_xfer_max_framelen(xfer);
2186 
2187 	if (ch->end == ch->start) {
2188 		DPRINTF("no buffer!\n");
2189 		return;
2190 	}
2191 
2192 	switch (USB_GET_STATE(xfer)) {
2193 	case USB_ST_TRANSFERRED:
2194 
2195 		DPRINTFN(6, "transferred %d bytes\n", actlen);
2196 
2197 		offset0 = 0;
2198 		pc = usbd_xfer_get_frame(xfer, 0);
2199 
2200 		for (n = 0; n != nframes; n++) {
2201 
2202 			offset1 = offset0;
2203 			len = usbd_xfer_frame_len(xfer, n);
2204 
2205 			while (len > 0) {
2206 
2207 				m = (ch->end - ch->cur);
2208 
2209 				if (m > len)
2210 					m = len;
2211 
2212 				usbd_copy_out(pc, offset1, ch->cur, m);
2213 
2214 				len -= m;
2215 				offset1 += m;
2216 				ch->cur += m;
2217 
2218 				if (ch->cur >= ch->end) {
2219 					ch->cur = ch->start;
2220 				}
2221 			}
2222 
2223 			offset0 += mfl;
2224 		}
2225 
2226 		chn_intr(ch->pcm_ch);
2227 
2228 	case USB_ST_SETUP:
2229 tr_setup:
2230 		blockcount = ch->intr_frames;
2231 
2232 		usbd_xfer_set_frames(xfer, blockcount);
2233 		for (n = 0; n < blockcount; n++) {
2234 			usbd_xfer_set_frame_len(xfer, n, mfl);
2235 		}
2236 
2237 		usbd_transfer_submit(xfer);
2238 		break;
2239 
2240 	default:			/* Error */
2241 		if (error == USB_ERR_CANCELLED) {
2242 			break;
2243 		}
2244 		goto tr_setup;
2245 	}
2246 }
2247 
2248 void   *
2249 uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b,
2250     struct pcm_channel *c, int dir)
2251 {
2252 	struct uaudio_chan *ch = ((dir == PCMDIR_PLAY) ?
2253 	    &sc->sc_play_chan : &sc->sc_rec_chan);
2254 	uint32_t buf_size;
2255 	uint8_t x;
2256 
2257 	/* store mutex and PCM channel */
2258 
2259 	ch->pcm_ch = c;
2260 	ch->pcm_mtx = c->lock;
2261 
2262 	/* compute worst case buffer */
2263 
2264 	buf_size = 0;
2265 	for (x = 0; x != ch->num_alt; x++) {
2266 		uint32_t temp = uaudio_get_buffer_size(ch, x);
2267 		if (temp > buf_size)
2268 			buf_size = temp;
2269 	}
2270 
2271 	/* allow double buffering */
2272 	buf_size *= 2;
2273 
2274 	DPRINTF("Worst case buffer is %d bytes\n", (int)buf_size);
2275 
2276 	ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO);
2277 	if (ch->buf == NULL)
2278 		goto error;
2279 	if (sndbuf_setup(b, ch->buf, buf_size) != 0)
2280 		goto error;
2281 
2282 	ch->start = ch->buf;
2283 	ch->end = ch->buf + buf_size;
2284 	ch->cur = ch->buf;
2285 	ch->pcm_buf = b;
2286 	ch->max_buf = buf_size;
2287 
2288 	if (ch->pcm_mtx == NULL) {
2289 		DPRINTF("ERROR: PCM channels does not have a mutex!\n");
2290 		goto error;
2291 	}
2292 	return (ch);
2293 
2294 error:
2295 	uaudio_chan_free(ch);
2296 	return (NULL);
2297 }
2298 
2299 int
2300 uaudio_chan_free(struct uaudio_chan *ch)
2301 {
2302 	if (ch->buf != NULL) {
2303 		free(ch->buf, M_DEVBUF);
2304 		ch->buf = NULL;
2305 	}
2306 	usbd_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS + 1);
2307 
2308 	ch->num_alt = 0;
2309 
2310 	return (0);
2311 }
2312 
2313 int
2314 uaudio_chan_set_param_blocksize(struct uaudio_chan *ch, uint32_t blocksize)
2315 {
2316 	uint32_t temp = 2 * uaudio_get_buffer_size(ch, ch->set_alt);
2317 
2318 	sndbuf_setup(ch->pcm_buf, ch->buf, temp);
2319 
2320 	ch->start = ch->buf;
2321 	ch->end = ch->buf + temp;
2322 	ch->cur = ch->buf;
2323 
2324 	return (temp / 2);
2325 }
2326 
2327 int
2328 uaudio_chan_set_param_fragments(struct uaudio_chan *ch, uint32_t blocksize,
2329     uint32_t blockcount)
2330 {
2331 	return (1);
2332 }
2333 
2334 int
2335 uaudio_chan_set_param_speed(struct uaudio_chan *ch, uint32_t speed)
2336 {
2337 	uint8_t x;
2338 
2339 	for (x = 0; x < ch->num_alt; x++) {
2340 		if (ch->usb_alt[x].sample_rate < speed) {
2341 			/* sample rate is too low */
2342 			break;
2343 		}
2344 	}
2345 
2346 	if (x != 0)
2347 		x--;
2348 
2349 	ch->set_alt = x;
2350 
2351 	DPRINTF("Selecting alt %d\n", (int)x);
2352 
2353 	return (ch->usb_alt[x].sample_rate);
2354 }
2355 
2356 int
2357 uaudio_chan_getptr(struct uaudio_chan *ch)
2358 {
2359 	return (ch->cur - ch->start);
2360 }
2361 
2362 struct pcmchan_caps *
2363 uaudio_chan_getcaps(struct uaudio_chan *ch)
2364 {
2365 	return (&ch->pcm_cap);
2366 }
2367 
2368 static struct pcmchan_matrix uaudio_chan_matrix_swap_2_0 = {
2369 	.id = SND_CHN_MATRIX_DRV,
2370 	.channels = 2,
2371 	.ext = 0,
2372 	.map = {
2373 		/* Right */
2374 		[0] = {
2375 			.type = SND_CHN_T_FR,
2376 			.members =
2377 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |
2378 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |
2379 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR
2380 		},
2381 		/* Left */
2382 		[1] = {
2383 			.type = SND_CHN_T_FL,
2384 			.members =
2385 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |
2386 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |
2387 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL
2388 		},
2389 		[2] = {
2390 			.type = SND_CHN_T_MAX,
2391 			.members = 0
2392 		}
2393 	},
2394 	.mask = SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FL,
2395 	.offset = {  1,  0, -1, -1, -1, -1, -1, -1, -1,
2396 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }
2397 };
2398 
2399 struct pcmchan_matrix *
2400 uaudio_chan_getmatrix(struct uaudio_chan *ch, uint32_t format)
2401 {
2402 	struct uaudio_softc *sc;
2403 
2404 	sc = ch->priv_sc;
2405 
2406 	if (sc != NULL && sc->sc_uq_audio_swap_lr != 0 &&
2407 	    AFMT_CHANNEL(format) == 2)
2408 		return (&uaudio_chan_matrix_swap_2_0);
2409 
2410 	return (feeder_matrix_format_map(format));
2411 }
2412 
2413 int
2414 uaudio_chan_set_param_format(struct uaudio_chan *ch, uint32_t format)
2415 {
2416 	DPRINTF("Selecting format 0x%08x\n", (unsigned int)format);
2417 	return (0);
2418 }
2419 
2420 int
2421 uaudio_chan_start(struct uaudio_chan *ch)
2422 {
2423 	struct uaudio_softc *sc = ch->priv_sc;
2424 	int do_start = 0;
2425 
2426 	usb_proc_explore_lock(sc->sc_udev);
2427 	if (ch->operation != CHAN_OP_DRAIN) {
2428 		if (ch->cur_alt == ch->set_alt &&
2429 		    ch->operation == CHAN_OP_NONE) {
2430 			/* save doing the explore task */
2431 			do_start = 1;
2432 		} else {
2433 			ch->operation = CHAN_OP_START;
2434 			(void)usb_proc_explore_msignal(sc->sc_udev,
2435 			    &sc->sc_config_msg[0], &sc->sc_config_msg[1]);
2436 		}
2437 	}
2438 	usb_proc_explore_unlock(sc->sc_udev);
2439 
2440 	if (do_start) {
2441 		usbd_transfer_start(ch->xfer[0]);
2442 		usbd_transfer_start(ch->xfer[1]);
2443 	}
2444 	return (0);
2445 }
2446 
2447 int
2448 uaudio_chan_stop(struct uaudio_chan *ch)
2449 {
2450 	struct uaudio_softc *sc = ch->priv_sc;
2451 	int do_stop = 0;
2452 
2453 	usb_proc_explore_lock(sc->sc_udev);
2454 	if (ch->operation != CHAN_OP_DRAIN) {
2455 		if (ch->cur_alt == ch->set_alt &&
2456 		    ch->operation == CHAN_OP_NONE) {
2457 			/* save doing the explore task */
2458 			do_stop = 1;
2459 		} else {
2460 			ch->operation = CHAN_OP_STOP;
2461 			(void)usb_proc_explore_msignal(sc->sc_udev,
2462 			    &sc->sc_config_msg[0], &sc->sc_config_msg[1]);
2463 		}
2464 	}
2465 	usb_proc_explore_unlock(sc->sc_udev);
2466 
2467 	if (do_stop) {
2468 		usbd_transfer_stop(ch->xfer[0]);
2469 		usbd_transfer_stop(ch->xfer[1]);
2470 	}
2471 	return (0);
2472 }
2473 
2474 /*========================================================================*
2475  * AC - Audio Controller - routines
2476  *========================================================================*/
2477 
2478 static int
2479 uaudio_mixer_sysctl_handler(SYSCTL_HANDLER_ARGS)
2480 {
2481 	struct uaudio_softc *sc;
2482 	struct uaudio_mixer_node *pmc;
2483 	int hint;
2484 	int error;
2485 	int temp = 0;
2486 	int chan = 0;
2487 
2488 	sc = (struct uaudio_softc *)oidp->oid_arg1;
2489 	hint = oidp->oid_arg2;
2490 
2491 	if (sc->sc_mixer_lock == NULL)
2492 		return (ENXIO);
2493 
2494 	/* lookup mixer node */
2495 
2496 	mtx_lock(sc->sc_mixer_lock);
2497 	for (pmc = sc->sc_mixer_root; pmc != NULL; pmc = pmc->next) {
2498 		for (chan = 0; chan != (int)pmc->nchan; chan++) {
2499 			if (pmc->wValue[chan] != -1 &&
2500 			    pmc->wValue[chan] == hint) {
2501 				temp = pmc->wData[chan];
2502 				goto found;
2503 			}
2504 		}
2505 	}
2506 found:
2507 	mtx_unlock(sc->sc_mixer_lock);
2508 
2509 	error = sysctl_handle_int(oidp, &temp, 0, req);
2510 	if (error != 0 || req->newptr == NULL)
2511 		return (error);
2512 
2513 	/* update mixer value */
2514 
2515 	mtx_lock(sc->sc_mixer_lock);
2516 	if (pmc != NULL &&
2517 	    temp >= pmc->minval &&
2518 	    temp <= pmc->maxval) {
2519 
2520 		pmc->wData[chan] = temp;
2521 		pmc->update[(chan / 8)] |= (1 << (chan % 8));
2522 
2523 		/* start the transfer, if not already started */
2524 		usbd_transfer_start(sc->sc_mixer_xfer[0]);
2525 	}
2526 	mtx_unlock(sc->sc_mixer_lock);
2527 
2528 	return (0);
2529 }
2530 
2531 static void
2532 uaudio_mixer_ctl_free(struct uaudio_softc *sc)
2533 {
2534 	struct uaudio_mixer_node *p_mc;
2535 
2536 	while ((p_mc = sc->sc_mixer_root) != NULL) {
2537 		sc->sc_mixer_root = p_mc->next;
2538 		free(p_mc, M_USBDEV);
2539 	}
2540 }
2541 
2542 static void
2543 uaudio_mixer_register_sysctl(struct uaudio_softc *sc, device_t dev)
2544 {
2545 	struct uaudio_mixer_node *pmc;
2546 	struct sysctl_oid *mixer_tree;
2547 	struct sysctl_oid *control_tree;
2548 	char buf[32];
2549 	int chan;
2550 	int n;
2551 
2552 	mixer_tree = SYSCTL_ADD_NODE(device_get_sysctl_ctx(dev),
2553 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "mixer",
2554 	    CTLFLAG_RD, NULL, "");
2555 
2556 	if (mixer_tree == NULL)
2557 		return;
2558 
2559 	for (n = 0, pmc = sc->sc_mixer_root; pmc != NULL;
2560 	    pmc = pmc->next, n++) {
2561 
2562 		for (chan = 0; chan < pmc->nchan; chan++) {
2563 
2564 			if (pmc->nchan > 1) {
2565 				snprintf(buf, sizeof(buf), "%s_%d_%d",
2566 				    pmc->name, n, chan);
2567 			} else {
2568 				snprintf(buf, sizeof(buf), "%s_%d",
2569 				    pmc->name, n);
2570 			}
2571 
2572 			control_tree = SYSCTL_ADD_NODE(device_get_sysctl_ctx(dev),
2573 			    SYSCTL_CHILDREN(mixer_tree), OID_AUTO, buf,
2574 			    CTLFLAG_RD, NULL, "Mixer control nodes");
2575 
2576 			if (control_tree == NULL)
2577 				continue;
2578 
2579 			SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
2580 			    SYSCTL_CHILDREN(control_tree),
2581 			    OID_AUTO, "val", CTLTYPE_INT | CTLFLAG_RW, sc,
2582 			    pmc->wValue[chan],
2583 			    uaudio_mixer_sysctl_handler, "I", "Current value");
2584 
2585 			SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
2586 			    SYSCTL_CHILDREN(control_tree),
2587 			    OID_AUTO, "min", CTLFLAG_RD, 0, pmc->minval,
2588 			    "Minimum value");
2589 
2590 			SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
2591 			    SYSCTL_CHILDREN(control_tree),
2592 			    OID_AUTO, "max", CTLFLAG_RD, 0, pmc->maxval,
2593 			    "Maximum value");
2594 
2595 			SYSCTL_ADD_STRING(device_get_sysctl_ctx(dev),
2596 			    SYSCTL_CHILDREN(control_tree),
2597 			    OID_AUTO, "desc", CTLFLAG_RD, pmc->desc, 0,
2598 			    "Description");
2599 		}
2600 	}
2601 }
2602 
2603 /* M-Audio FastTrack Ultra Mixer Description */
2604 /* Origin: Linux USB Audio driver */
2605 static void
2606 uaudio_mixer_controls_create_ftu(struct uaudio_softc *sc)
2607 {
2608 	int chx;
2609 	int chy;
2610 
2611 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2612 	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
2613 	MIX(sc).wValue[0] = MAKE_WORD(8, 0);
2614 	MIX(sc).class = UAC_OUTPUT;
2615 	MIX(sc).type = MIX_UNSIGNED_16;
2616 	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2617 	MIX(sc).name = "effect";
2618 	MIX(sc).minval = 0;
2619 	MIX(sc).maxval = 7;
2620 	MIX(sc).mul = 7;
2621 	MIX(sc).nchan = 1;
2622 	MIX(sc).update[0] = 1;
2623 	strlcpy(MIX(sc).desc, "Room1,2,3,Hall1,2,Plate,Delay,Echo", sizeof(MIX(sc).desc));
2624 	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
2625 
2626 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2627 	MIX(sc).wIndex = MAKE_WORD(5, sc->sc_mixer_iface_no);
2628 
2629 	for (chx = 0; chx != 8; chx++) {
2630 		for (chy = 0; chy != 8; chy++) {
2631 
2632 			MIX(sc).wValue[0] = MAKE_WORD(chx + 1, chy + 1);
2633 			MIX(sc).type = MIX_SIGNED_16;
2634 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2635 			MIX(sc).name = "mix_rec";
2636 			MIX(sc).nchan = 1;
2637 			MIX(sc).update[0] = 1;
2638 			MIX(sc).val_default = 0;
2639 			snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
2640 			    "AIn%d - Out%d Record Volume", chy + 1, chx + 1);
2641 
2642 			uaudio_mixer_add_ctl(sc, &MIX(sc));
2643 
2644 			MIX(sc).wValue[0] = MAKE_WORD(chx + 1, chy + 1 + 8);
2645 			MIX(sc).type = MIX_SIGNED_16;
2646 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2647 			MIX(sc).name = "mix_play";
2648 			MIX(sc).nchan = 1;
2649 			MIX(sc).update[0] = 1;
2650 			MIX(sc).val_default = (chx == chy) ? 2 : 0;
2651 			snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
2652 			    "DIn%d - Out%d Playback Volume", chy + 1, chx + 1);
2653 
2654 			uaudio_mixer_add_ctl(sc, &MIX(sc));
2655 		}
2656 	}
2657 
2658 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2659 	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
2660 	MIX(sc).wValue[0] = MAKE_WORD(2, 0);
2661 	MIX(sc).class = UAC_OUTPUT;
2662 	MIX(sc).type = MIX_SIGNED_8;
2663 	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2664 	MIX(sc).name = "effect_vol";
2665 	MIX(sc).nchan = 1;
2666 	MIX(sc).update[0] = 1;
2667 	MIX(sc).minval = 0;
2668 	MIX(sc).maxval = 0x7f;
2669 	MIX(sc).mul = 0x7f;
2670 	MIX(sc).nchan = 1;
2671 	MIX(sc).update[0] = 1;
2672 	strlcpy(MIX(sc).desc, "Effect Volume", sizeof(MIX(sc).desc));
2673 	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
2674 
2675 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2676 	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
2677 	MIX(sc).wValue[0] = MAKE_WORD(3, 0);
2678 	MIX(sc).class = UAC_OUTPUT;
2679 	MIX(sc).type = MIX_SIGNED_16;
2680 	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2681 	MIX(sc).name = "effect_dur";
2682 	MIX(sc).nchan = 1;
2683 	MIX(sc).update[0] = 1;
2684 	MIX(sc).minval = 0;
2685 	MIX(sc).maxval = 0x7f00;
2686 	MIX(sc).mul = 0x7f00;
2687 	MIX(sc).nchan = 1;
2688 	MIX(sc).update[0] = 1;
2689 	strlcpy(MIX(sc).desc, "Effect Duration", sizeof(MIX(sc).desc));
2690 	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
2691 
2692 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2693 	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
2694 	MIX(sc).wValue[0] = MAKE_WORD(4, 0);
2695 	MIX(sc).class = UAC_OUTPUT;
2696 	MIX(sc).type = MIX_SIGNED_8;
2697 	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2698 	MIX(sc).name = "effect_fb";
2699 	MIX(sc).nchan = 1;
2700 	MIX(sc).update[0] = 1;
2701 	MIX(sc).minval = 0;
2702 	MIX(sc).maxval = 0x7f;
2703 	MIX(sc).mul = 0x7f;
2704 	MIX(sc).nchan = 1;
2705 	MIX(sc).update[0] = 1;
2706 	strlcpy(MIX(sc).desc, "Effect Feedback Volume", sizeof(MIX(sc).desc));
2707 	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
2708 
2709 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2710 	MIX(sc).wIndex = MAKE_WORD(7, sc->sc_mixer_iface_no);
2711 	for (chy = 0; chy != 4; chy++) {
2712 
2713 		MIX(sc).wValue[0] = MAKE_WORD(7, chy + 1);
2714 		MIX(sc).type = MIX_SIGNED_16;
2715 		MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2716 		MIX(sc).name = "effect_ret";
2717 		MIX(sc).nchan = 1;
2718 		MIX(sc).update[0] = 1;
2719 		snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
2720 		    "Effect Return %d Volume", chy + 1);
2721 
2722 		uaudio_mixer_add_ctl(sc, &MIX(sc));
2723 	}
2724 
2725 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2726 	MIX(sc).wIndex = MAKE_WORD(5, sc->sc_mixer_iface_no);
2727 
2728 	for (chy = 0; chy != 8; chy++) {
2729 		MIX(sc).wValue[0] = MAKE_WORD(9, chy + 1);
2730 		MIX(sc).type = MIX_SIGNED_16;
2731 		MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2732 		MIX(sc).name = "effect_send";
2733 		MIX(sc).nchan = 1;
2734 		MIX(sc).update[0] = 1;
2735 		snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
2736 		    "Effect Send AIn%d Volume", chy + 1);
2737 
2738 		uaudio_mixer_add_ctl(sc, &MIX(sc));
2739 
2740 		MIX(sc).wValue[0] = MAKE_WORD(9, chy + 1);
2741 		MIX(sc).type = MIX_SIGNED_16;
2742 		MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
2743 		MIX(sc).name = "effect_send";
2744 		MIX(sc).nchan = 1;
2745 		MIX(sc).update[0] = 1;
2746 		snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
2747 		    "Effect Send DIn%d Volume", chy + 1 + 8);
2748 
2749 		uaudio_mixer_add_ctl(sc, &MIX(sc));
2750 	}
2751 }
2752 
2753 static void
2754 uaudio_mixer_reload_all(struct uaudio_softc *sc)
2755 {
2756 	struct uaudio_mixer_node *pmc;
2757 	int chan;
2758 
2759 	if (sc->sc_mixer_lock == NULL)
2760 		return;
2761 
2762 	mtx_lock(sc->sc_mixer_lock);
2763 	for (pmc = sc->sc_mixer_root; pmc != NULL; pmc = pmc->next) {
2764 		/* use reset defaults for non-oss controlled settings */
2765 		if (pmc->ctl == SOUND_MIXER_NRDEVICES)
2766 			continue;
2767 		for (chan = 0; chan < pmc->nchan; chan++)
2768 			pmc->update[chan / 8] |= (1 << (chan % 8));
2769 	}
2770 	usbd_transfer_start(sc->sc_mixer_xfer[0]);
2771 
2772 	/* start HID volume keys, if any */
2773 	usbd_transfer_start(sc->sc_hid.xfer[0]);
2774 	mtx_unlock(sc->sc_mixer_lock);
2775 }
2776 
2777 static void
2778 uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
2779 {
2780 	struct uaudio_mixer_node *p_mc_new =
2781 	    malloc(sizeof(*p_mc_new), M_USBDEV, M_WAITOK);
2782 	int ch;
2783 
2784 	if (p_mc_new != NULL) {
2785 		memcpy(p_mc_new, mc, sizeof(*p_mc_new));
2786 		p_mc_new->next = sc->sc_mixer_root;
2787 		sc->sc_mixer_root = p_mc_new;
2788 		sc->sc_mixer_count++;
2789 
2790 		/* set default value for all channels */
2791 		for (ch = 0; ch < p_mc_new->nchan; ch++) {
2792 			switch (p_mc_new->val_default) {
2793 			case 1:
2794 				/* 50% */
2795 				p_mc_new->wData[ch] = (p_mc_new->maxval + p_mc_new->minval) / 2;
2796 				break;
2797 			case 2:
2798 				/* 100% */
2799 				p_mc_new->wData[ch] = p_mc_new->maxval;
2800 				break;
2801 			default:
2802 				/* 0% */
2803 				p_mc_new->wData[ch] = p_mc_new->minval;
2804 				break;
2805 			}
2806 		}
2807 	} else {
2808 		DPRINTF("out of memory\n");
2809 	}
2810 }
2811 
2812 static void
2813 uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
2814 {
2815 	int32_t res;
2816 
2817 	if (mc->class < UAC_NCLASSES) {
2818 		DPRINTF("adding %s.%d\n",
2819 		    uac_names[mc->class], mc->ctl);
2820 	} else {
2821 		DPRINTF("adding %d\n", mc->ctl);
2822 	}
2823 
2824 	if (mc->type == MIX_ON_OFF) {
2825 		mc->minval = 0;
2826 		mc->maxval = 1;
2827 	} else if (mc->type == MIX_SELECTOR) {
2828 	} else {
2829 
2830 		/* determine min and max values */
2831 
2832 		mc->minval = uaudio_mixer_get(sc->sc_udev,
2833 		    sc->sc_audio_rev, GET_MIN, mc);
2834 		mc->maxval = uaudio_mixer_get(sc->sc_udev,
2835 		    sc->sc_audio_rev, GET_MAX, mc);
2836 
2837 		/* check if max and min was swapped */
2838 
2839 		if (mc->maxval < mc->minval) {
2840 			res = mc->maxval;
2841 			mc->maxval = mc->minval;
2842 			mc->minval = res;
2843 		}
2844 
2845 		/* compute value range */
2846 		mc->mul = mc->maxval - mc->minval;
2847 		if (mc->mul == 0)
2848 			mc->mul = 1;
2849 
2850 		/* compute value alignment */
2851 		res = uaudio_mixer_get(sc->sc_udev,
2852 		    sc->sc_audio_rev, GET_RES, mc);
2853 
2854 		DPRINTF("Resolution = %d\n", (int)res);
2855 	}
2856 
2857 	uaudio_mixer_add_ctl_sub(sc, mc);
2858 
2859 #ifdef USB_DEBUG
2860 	if (uaudio_debug > 2) {
2861 		uint8_t i;
2862 
2863 		for (i = 0; i < mc->nchan; i++) {
2864 			DPRINTF("[mix] wValue=%04x\n", mc->wValue[0]);
2865 		}
2866 		DPRINTF("[mix] wIndex=%04x type=%d ctl='%d' "
2867 		    "min=%d max=%d\n",
2868 		    mc->wIndex, mc->type, mc->ctl,
2869 		    mc->minval, mc->maxval);
2870 	}
2871 #endif
2872 }
2873 
2874 static void
2875 uaudio_mixer_add_mixer(struct uaudio_softc *sc,
2876     const struct uaudio_terminal_node *iot, int id)
2877 {
2878 	const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu_v1;
2879 	const struct usb_audio_mixer_unit_1 *d1;
2880 
2881 	uint32_t bno;			/* bit number */
2882 	uint32_t p;			/* bit number accumulator */
2883 	uint32_t mo;			/* matching outputs */
2884 	uint32_t mc;			/* matching channels */
2885 	uint32_t ichs;			/* input channels */
2886 	uint32_t ochs;			/* output channels */
2887 	uint32_t c;
2888 	uint32_t chs;			/* channels */
2889 	uint32_t i;
2890 	uint32_t o;
2891 
2892 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
2893 	    d0->bUnitId, d0->bNrInPins);
2894 
2895 	/* compute the number of input channels */
2896 
2897 	ichs = 0;
2898 	for (i = 0; i < d0->bNrInPins; i++) {
2899 		ichs += uaudio_mixer_get_cluster(
2900 		    d0->baSourceId[i], iot).bNrChannels;
2901 	}
2902 
2903 	d1 = (const void *)(d0->baSourceId + d0->bNrInPins);
2904 
2905 	/* and the number of output channels */
2906 
2907 	ochs = d1->bNrChannels;
2908 
2909 	DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs);
2910 
2911 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2912 
2913 	MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
2914 	uaudio_mixer_determine_class(&iot[id], &MIX(sc));
2915 	MIX(sc).type = MIX_SIGNED_16;
2916 
2917 	if (uaudio_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL)
2918 		return;
2919 
2920 	for (p = i = 0; i < d0->bNrInPins; i++) {
2921 		chs = uaudio_mixer_get_cluster(
2922 		    d0->baSourceId[i], iot).bNrChannels;
2923 		mc = 0;
2924 		for (c = 0; c < chs; c++) {
2925 			mo = 0;
2926 			for (o = 0; o < ochs; o++) {
2927 				bno = ((p + c) * ochs) + o;
2928 				if (BIT_TEST(d1->bmControls, bno))
2929 					mo++;
2930 			}
2931 			if (mo == 1)
2932 				mc++;
2933 		}
2934 		if ((mc == chs) && (chs <= MIX_MAX_CHAN)) {
2935 
2936 			/* repeat bit-scan */
2937 
2938 			mc = 0;
2939 			for (c = 0; c < chs; c++) {
2940 				for (o = 0; o < ochs; o++) {
2941 					bno = ((p + c) * ochs) + o;
2942 					if (BIT_TEST(d1->bmControls, bno))
2943 						MIX(sc).wValue[mc++] = MAKE_WORD(p + c + 1, o + 1);
2944 				}
2945 			}
2946 			MIX(sc).nchan = chs;
2947 			uaudio_mixer_add_ctl(sc, &MIX(sc));
2948 		}
2949 		p += chs;
2950 	}
2951 }
2952 
2953 static void
2954 uaudio20_mixer_add_mixer(struct uaudio_softc *sc,
2955     const struct uaudio_terminal_node *iot, int id)
2956 {
2957 	const struct usb_audio20_mixer_unit_0 *d0 = iot[id].u.mu_v2;
2958 	const struct usb_audio20_mixer_unit_1 *d1;
2959 
2960 	uint32_t bno;			/* bit number */
2961 	uint32_t p;			/* bit number accumulator */
2962 	uint32_t mo;			/* matching outputs */
2963 	uint32_t mc;			/* matching channels */
2964 	uint32_t ichs;			/* input channels */
2965 	uint32_t ochs;			/* output channels */
2966 	uint32_t c;
2967 	uint32_t chs;			/* channels */
2968 	uint32_t i;
2969 	uint32_t o;
2970 
2971 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
2972 	    d0->bUnitId, d0->bNrInPins);
2973 
2974 	/* compute the number of input channels */
2975 
2976 	ichs = 0;
2977 	for (i = 0; i < d0->bNrInPins; i++) {
2978 		ichs += uaudio20_mixer_get_cluster(
2979 		    d0->baSourceId[i], iot).bNrChannels;
2980 	}
2981 
2982 	d1 = (const void *)(d0->baSourceId + d0->bNrInPins);
2983 
2984 	/* and the number of output channels */
2985 
2986 	ochs = d1->bNrChannels;
2987 
2988 	DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs);
2989 
2990 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
2991 
2992 	MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
2993 	uaudio20_mixer_determine_class(&iot[id], &MIX(sc));
2994 	MIX(sc).type = MIX_SIGNED_16;
2995 
2996 	if (uaudio20_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL)
2997 		return;
2998 
2999 	for (p = i = 0; i < d0->bNrInPins; i++) {
3000 		chs = uaudio20_mixer_get_cluster(
3001 		    d0->baSourceId[i], iot).bNrChannels;
3002 		mc = 0;
3003 		for (c = 0; c < chs; c++) {
3004 			mo = 0;
3005 			for (o = 0; o < ochs; o++) {
3006 				bno = ((p + c) * ochs) + o;
3007 				if (BIT_TEST(d1->bmControls, bno))
3008 					mo++;
3009 			}
3010 			if (mo == 1)
3011 				mc++;
3012 		}
3013 		if ((mc == chs) && (chs <= MIX_MAX_CHAN)) {
3014 
3015 			/* repeat bit-scan */
3016 
3017 			mc = 0;
3018 			for (c = 0; c < chs; c++) {
3019 				for (o = 0; o < ochs; o++) {
3020 					bno = ((p + c) * ochs) + o;
3021 					if (BIT_TEST(d1->bmControls, bno))
3022 						MIX(sc).wValue[mc++] = MAKE_WORD(p + c + 1, o + 1);
3023 				}
3024 			}
3025 			MIX(sc).nchan = chs;
3026 			uaudio_mixer_add_ctl(sc, &MIX(sc));
3027 		}
3028 		p += chs;
3029 	}
3030 }
3031 
3032 static void
3033 uaudio_mixer_add_selector(struct uaudio_softc *sc,
3034     const struct uaudio_terminal_node *iot, int id)
3035 {
3036 	const struct usb_audio_selector_unit *d = iot[id].u.su_v1;
3037 	uint16_t i;
3038 
3039 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3040 	    d->bUnitId, d->bNrInPins);
3041 
3042 	if (d->bNrInPins == 0)
3043 		return;
3044 
3045 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3046 
3047 	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3048 	MIX(sc).wValue[0] = MAKE_WORD(0, 0);
3049 	uaudio_mixer_determine_class(&iot[id], &MIX(sc));
3050 	MIX(sc).nchan = 1;
3051 	MIX(sc).type = MIX_SELECTOR;
3052 	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3053 	MIX(sc).minval = 1;
3054 	MIX(sc).maxval = d->bNrInPins;
3055 	MIX(sc).name = "selector";
3056 
3057 	i = d->baSourceId[d->bNrInPins];
3058 	if (i == 0 ||
3059 	    usbd_req_get_string_any(sc->sc_udev, NULL,
3060 	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3061 		MIX(sc).desc[0] = 0;
3062 	}
3063 
3064 	if (MIX(sc).maxval > MAX_SELECTOR_INPUT_PIN) {
3065 		MIX(sc).maxval = MAX_SELECTOR_INPUT_PIN;
3066 	}
3067 	MIX(sc).mul = (MIX(sc).maxval - MIX(sc).minval);
3068 	for (i = 0; i < MAX_SELECTOR_INPUT_PIN; i++) {
3069 		MIX(sc).slctrtype[i] = SOUND_MIXER_NRDEVICES;
3070 	}
3071 
3072 	for (i = 0; i < MIX(sc).maxval; i++) {
3073 		MIX(sc).slctrtype[i] = uaudio_mixer_feature_name(
3074 		    &iot[d->baSourceId[i]], &MIX(sc));
3075 	}
3076 
3077 	MIX(sc).class = 0;			/* not used */
3078 
3079 	uaudio_mixer_add_ctl(sc, &MIX(sc));
3080 }
3081 
3082 static void
3083 uaudio20_mixer_add_selector(struct uaudio_softc *sc,
3084     const struct uaudio_terminal_node *iot, int id)
3085 {
3086 	const struct usb_audio20_selector_unit *d = iot[id].u.su_v2;
3087 	uint16_t i;
3088 
3089 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3090 	    d->bUnitId, d->bNrInPins);
3091 
3092 	if (d->bNrInPins == 0)
3093 		return;
3094 
3095 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3096 
3097 	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3098 	MIX(sc).wValue[0] = MAKE_WORD(0, 0);
3099 	uaudio20_mixer_determine_class(&iot[id], &MIX(sc));
3100 	MIX(sc).nchan = 1;
3101 	MIX(sc).type = MIX_SELECTOR;
3102 	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3103 	MIX(sc).minval = 1;
3104 	MIX(sc).maxval = d->bNrInPins;
3105 	MIX(sc).name = "selector";
3106 
3107 	i = d->baSourceId[d->bNrInPins];
3108 	if (i == 0 ||
3109 	    usbd_req_get_string_any(sc->sc_udev, NULL,
3110 	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3111 		MIX(sc).desc[0] = 0;
3112 	}
3113 
3114 	if (MIX(sc).maxval > MAX_SELECTOR_INPUT_PIN)
3115 		MIX(sc).maxval = MAX_SELECTOR_INPUT_PIN;
3116 
3117 	MIX(sc).mul = (MIX(sc).maxval - MIX(sc).minval);
3118 	for (i = 0; i < MAX_SELECTOR_INPUT_PIN; i++)
3119 		MIX(sc).slctrtype[i] = SOUND_MIXER_NRDEVICES;
3120 
3121 	for (i = 0; i < MIX(sc).maxval; i++) {
3122 		MIX(sc).slctrtype[i] = uaudio20_mixer_feature_name(
3123 		    &iot[d->baSourceId[i]], &MIX(sc));
3124 	}
3125 
3126 	MIX(sc).class = 0;			/* not used */
3127 
3128 	uaudio_mixer_add_ctl(sc, &MIX(sc));
3129 }
3130 
3131 static uint32_t
3132 uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d,
3133     uint8_t i)
3134 {
3135 	uint32_t temp = 0;
3136 	uint32_t offset = (i * d->bControlSize);
3137 
3138 	if (d->bControlSize > 0) {
3139 		temp |= d->bmaControls[offset];
3140 		if (d->bControlSize > 1) {
3141 			temp |= d->bmaControls[offset + 1] << 8;
3142 			if (d->bControlSize > 2) {
3143 				temp |= d->bmaControls[offset + 2] << 16;
3144 				if (d->bControlSize > 3) {
3145 					temp |= d->bmaControls[offset + 3] << 24;
3146 				}
3147 			}
3148 		}
3149 	}
3150 	return (temp);
3151 }
3152 
3153 static void
3154 uaudio_mixer_add_feature(struct uaudio_softc *sc,
3155     const struct uaudio_terminal_node *iot, int id)
3156 {
3157 	const struct usb_audio_feature_unit *d = iot[id].u.fu_v1;
3158 	uint32_t fumask;
3159 	uint32_t mmask;
3160 	uint32_t cmask;
3161 	uint16_t mixernumber;
3162 	uint8_t nchan;
3163 	uint8_t chan;
3164 	uint8_t ctl;
3165 	uint8_t i;
3166 
3167 	if (d->bControlSize == 0)
3168 		return;
3169 
3170 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3171 
3172 	nchan = (d->bLength - 7) / d->bControlSize;
3173 	mmask = uaudio_mixer_feature_get_bmaControls(d, 0);
3174 	cmask = 0;
3175 
3176 	if (nchan == 0)
3177 		return;
3178 
3179 	/* figure out what we can control */
3180 
3181 	for (chan = 1; chan < nchan; chan++) {
3182 		DPRINTFN(10, "chan=%d mask=%x\n",
3183 		    chan, uaudio_mixer_feature_get_bmaControls(d, chan));
3184 
3185 		cmask |= uaudio_mixer_feature_get_bmaControls(d, chan);
3186 	}
3187 
3188 	if (nchan > MIX_MAX_CHAN) {
3189 		nchan = MIX_MAX_CHAN;
3190 	}
3191 	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3192 
3193 	i = d->bmaControls[d->bControlSize];
3194 	if (i == 0 ||
3195 	    usbd_req_get_string_any(sc->sc_udev, NULL,
3196 	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3197 		MIX(sc).desc[0] = 0;
3198 	}
3199 
3200 	for (ctl = 1; ctl <= LOUDNESS_CONTROL; ctl++) {
3201 
3202 		fumask = FU_MASK(ctl);
3203 
3204 		DPRINTFN(5, "ctl=%d fumask=0x%04x\n",
3205 		    ctl, fumask);
3206 
3207 		if (mmask & fumask) {
3208 			MIX(sc).nchan = 1;
3209 			MIX(sc).wValue[0] = MAKE_WORD(ctl, 0);
3210 		} else if (cmask & fumask) {
3211 			MIX(sc).nchan = nchan - 1;
3212 			for (i = 1; i < nchan; i++) {
3213 				if (uaudio_mixer_feature_get_bmaControls(d, i) & fumask)
3214 					MIX(sc).wValue[i - 1] = MAKE_WORD(ctl, i);
3215 				else
3216 					MIX(sc).wValue[i - 1] = -1;
3217 			}
3218 		} else {
3219 			continue;
3220 		}
3221 
3222 		mixernumber = uaudio_mixer_feature_name(&iot[id], &MIX(sc));
3223 
3224 		switch (ctl) {
3225 		case MUTE_CONTROL:
3226 			MIX(sc).type = MIX_ON_OFF;
3227 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3228 			MIX(sc).name = "mute";
3229 			break;
3230 
3231 		case VOLUME_CONTROL:
3232 			MIX(sc).type = MIX_SIGNED_16;
3233 			MIX(sc).ctl = mixernumber;
3234 			MIX(sc).name = "vol";
3235 			break;
3236 
3237 		case BASS_CONTROL:
3238 			MIX(sc).type = MIX_SIGNED_8;
3239 			MIX(sc).ctl = SOUND_MIXER_BASS;
3240 			MIX(sc).name = "bass";
3241 			break;
3242 
3243 		case MID_CONTROL:
3244 			MIX(sc).type = MIX_SIGNED_8;
3245 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3246 			MIX(sc).name = "mid";
3247 			break;
3248 
3249 		case TREBLE_CONTROL:
3250 			MIX(sc).type = MIX_SIGNED_8;
3251 			MIX(sc).ctl = SOUND_MIXER_TREBLE;
3252 			MIX(sc).name = "treble";
3253 			break;
3254 
3255 		case GRAPHIC_EQUALIZER_CONTROL:
3256 			continue;	/* XXX don't add anything */
3257 
3258 		case AGC_CONTROL:
3259 			MIX(sc).type = MIX_ON_OFF;
3260 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3261 			MIX(sc).name = "agc";
3262 			break;
3263 
3264 		case DELAY_CONTROL:
3265 			MIX(sc).type = MIX_UNSIGNED_16;
3266 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3267 			MIX(sc).name = "delay";
3268 			break;
3269 
3270 		case BASS_BOOST_CONTROL:
3271 			MIX(sc).type = MIX_ON_OFF;
3272 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3273 			MIX(sc).name = "boost";
3274 			break;
3275 
3276 		case LOUDNESS_CONTROL:
3277 			MIX(sc).type = MIX_ON_OFF;
3278 			MIX(sc).ctl = SOUND_MIXER_LOUD;	/* Is this correct ? */
3279 			MIX(sc).name = "loudness";
3280 			break;
3281 
3282 		default:
3283 			MIX(sc).type = MIX_UNKNOWN;
3284 			break;
3285 		}
3286 
3287 		if (MIX(sc).type != MIX_UNKNOWN)
3288 			uaudio_mixer_add_ctl(sc, &MIX(sc));
3289 	}
3290 }
3291 
3292 static void
3293 uaudio20_mixer_add_feature(struct uaudio_softc *sc,
3294     const struct uaudio_terminal_node *iot, int id)
3295 {
3296 	const struct usb_audio20_feature_unit *d = iot[id].u.fu_v2;
3297 	uint32_t ctl;
3298 	uint32_t mmask;
3299 	uint32_t cmask;
3300 	uint16_t mixernumber;
3301 	uint8_t nchan;
3302 	uint8_t chan;
3303 	uint8_t i;
3304 	uint8_t what;
3305 
3306 	if (UGETDW(d->bmaControls[0]) == 0)
3307 		return;
3308 
3309 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3310 
3311 	nchan = (d->bLength - 6) / 4;
3312 	mmask = UGETDW(d->bmaControls[0]);
3313 	cmask = 0;
3314 
3315 	if (nchan == 0)
3316 		return;
3317 
3318 	/* figure out what we can control */
3319 
3320 	for (chan = 1; chan < nchan; chan++)
3321 		cmask |= UGETDW(d->bmaControls[chan]);
3322 
3323 	if (nchan > MIX_MAX_CHAN)
3324 		nchan = MIX_MAX_CHAN;
3325 
3326 	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3327 
3328 	i = d->bmaControls[nchan][0];
3329 	if (i == 0 ||
3330 	    usbd_req_get_string_any(sc->sc_udev, NULL,
3331 	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3332 		MIX(sc).desc[0] = 0;
3333 	}
3334 
3335 	for (ctl = 3; ctl != 0; ctl <<= 2) {
3336 
3337 		mixernumber = uaudio20_mixer_feature_name(&iot[id], &MIX(sc));
3338 
3339 		switch (ctl) {
3340 		case (3 << 0):
3341 			MIX(sc).type = MIX_ON_OFF;
3342 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3343 			MIX(sc).name = "mute";
3344 			what = MUTE_CONTROL;
3345 			break;
3346 		case (3 << 2):
3347 			MIX(sc).type = MIX_SIGNED_16;
3348 			MIX(sc).ctl = mixernumber;
3349 			MIX(sc).name = "vol";
3350 			what = VOLUME_CONTROL;
3351 			break;
3352 		case (3 << 4):
3353 			MIX(sc).type = MIX_SIGNED_8;
3354 			MIX(sc).ctl = SOUND_MIXER_BASS;
3355 			MIX(sc).name = "bass";
3356 			what = BASS_CONTROL;
3357 			break;
3358 		case (3 << 6):
3359 			MIX(sc).type = MIX_SIGNED_8;
3360 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3361 			MIX(sc).name = "mid";
3362 			what = MID_CONTROL;
3363 			break;
3364 		case (3 << 8):
3365 			MIX(sc).type = MIX_SIGNED_8;
3366 			MIX(sc).ctl = SOUND_MIXER_TREBLE;
3367 			MIX(sc).name = "treble";
3368 			what = TREBLE_CONTROL;
3369 			break;
3370 		case (3 << 12):
3371 			MIX(sc).type = MIX_ON_OFF;
3372 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3373 			MIX(sc).name = "agc";
3374 			what = AGC_CONTROL;
3375 			break;
3376 		case (3 << 14):
3377 			MIX(sc).type = MIX_UNSIGNED_16;
3378 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3379 			MIX(sc).name = "delay";
3380 			what = DELAY_CONTROL;
3381 			break;
3382 		case (3 << 16):
3383 			MIX(sc).type = MIX_ON_OFF;
3384 			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3385 			MIX(sc).name = "boost";
3386 			what = BASS_BOOST_CONTROL;
3387 			break;
3388 		case (3 << 18):
3389 			MIX(sc).type = MIX_ON_OFF;
3390 			MIX(sc).ctl = SOUND_MIXER_LOUD;	/* Is this correct ? */
3391 			MIX(sc).name = "loudness";
3392 			what = LOUDNESS_CONTROL;
3393 			break;
3394 		case (3 << 20):
3395 			MIX(sc).type = MIX_SIGNED_16;
3396 			MIX(sc).ctl = mixernumber;
3397 			MIX(sc).name = "igain";
3398 			what = INPUT_GAIN_CONTROL;
3399 			break;
3400 		case (3 << 22):
3401 			MIX(sc).type = MIX_SIGNED_16;
3402 			MIX(sc).ctl = mixernumber;
3403 			MIX(sc).name = "igainpad";
3404 			what = INPUT_GAIN_PAD_CONTROL;
3405 			break;
3406 		default:
3407 			continue;
3408 		}
3409 
3410 		if ((mmask & ctl) == ctl) {
3411 			MIX(sc).nchan = 1;
3412 			MIX(sc).wValue[0] = MAKE_WORD(what, 0);
3413 		} else if ((cmask & ctl) == ctl) {
3414 			MIX(sc).nchan = nchan - 1;
3415 			for (i = 1; i < nchan; i++) {
3416 				if ((UGETDW(d->bmaControls[i]) & ctl) == ctl)
3417 					MIX(sc).wValue[i - 1] = MAKE_WORD(what, i);
3418 				else
3419 					MIX(sc).wValue[i - 1] = -1;
3420 			}
3421 		} else {
3422 			continue;
3423 		}
3424 
3425 		if (MIX(sc).type != MIX_UNKNOWN)
3426 			uaudio_mixer_add_ctl(sc, &MIX(sc));
3427 	}
3428 }
3429 
3430 static void
3431 uaudio_mixer_add_processing_updown(struct uaudio_softc *sc,
3432     const struct uaudio_terminal_node *iot, int id)
3433 {
3434 	const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu_v1;
3435 	const struct usb_audio_processing_unit_1 *d1 =
3436 	    (const void *)(d0->baSourceId + d0->bNrInPins);
3437 	const struct usb_audio_processing_unit_updown *ud =
3438 	    (const void *)(d1->bmControls + d1->bControlSize);
3439 	uint8_t i;
3440 
3441 	if (uaudio_mixer_verify_desc(d0, sizeof(*ud)) == NULL) {
3442 		return;
3443 	}
3444 	if (uaudio_mixer_verify_desc(d0, sizeof(*ud) + (2 * ud->bNrModes))
3445 	    == NULL) {
3446 		return;
3447 	}
3448 	DPRINTFN(3, "bUnitId=%d bNrModes=%d\n",
3449 	    d0->bUnitId, ud->bNrModes);
3450 
3451 	if (!(d1->bmControls[0] & UA_PROC_MASK(UD_MODE_SELECT_CONTROL))) {
3452 		DPRINTF("no mode select\n");
3453 		return;
3454 	}
3455 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3456 
3457 	MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3458 	MIX(sc).nchan = 1;
3459 	MIX(sc).wValue[0] = MAKE_WORD(UD_MODE_SELECT_CONTROL, 0);
3460 	uaudio_mixer_determine_class(&iot[id], &MIX(sc));
3461 	MIX(sc).type = MIX_ON_OFF;		/* XXX */
3462 
3463 	for (i = 0; i < ud->bNrModes; i++) {
3464 		DPRINTFN(3, "i=%d bm=0x%x\n", i, UGETW(ud->waModes[i]));
3465 		/* XXX */
3466 	}
3467 
3468 	uaudio_mixer_add_ctl(sc, &MIX(sc));
3469 }
3470 
3471 static void
3472 uaudio_mixer_add_processing(struct uaudio_softc *sc,
3473     const struct uaudio_terminal_node *iot, int id)
3474 {
3475 	const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu_v1;
3476 	const struct usb_audio_processing_unit_1 *d1 =
3477 	    (const void *)(d0->baSourceId + d0->bNrInPins);
3478 	uint16_t ptype;
3479 
3480 	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3481 
3482 	ptype = UGETW(d0->wProcessType);
3483 
3484 	DPRINTFN(3, "wProcessType=%d bUnitId=%d "
3485 	    "bNrInPins=%d\n", ptype, d0->bUnitId, d0->bNrInPins);
3486 
3487 	if (d1->bControlSize == 0) {
3488 		return;
3489 	}
3490 	if (d1->bmControls[0] & UA_PROC_ENABLE_MASK) {
3491 		MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3492 		MIX(sc).nchan = 1;
3493 		MIX(sc).wValue[0] = MAKE_WORD(XX_ENABLE_CONTROL, 0);
3494 		uaudio_mixer_determine_class(&iot[id], &MIX(sc));
3495 		MIX(sc).type = MIX_ON_OFF;
3496 		uaudio_mixer_add_ctl(sc, &MIX(sc));
3497 	}
3498 	switch (ptype) {
3499 	case UPDOWNMIX_PROCESS:
3500 		uaudio_mixer_add_processing_updown(sc, iot, id);
3501 		break;
3502 
3503 	case DOLBY_PROLOGIC_PROCESS:
3504 	case P3D_STEREO_EXTENDER_PROCESS:
3505 	case REVERBATION_PROCESS:
3506 	case CHORUS_PROCESS:
3507 	case DYN_RANGE_COMP_PROCESS:
3508 	default:
3509 		DPRINTF("unit %d, type=%d is not implemented\n",
3510 		    d0->bUnitId, ptype);
3511 		break;
3512 	}
3513 }
3514 
3515 static void
3516 uaudio_mixer_add_extension(struct uaudio_softc *sc,
3517     const struct uaudio_terminal_node *iot, int id)
3518 {
3519 	const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu_v1;
3520 	const struct usb_audio_extension_unit_1 *d1 =
3521 	    (const void *)(d0->baSourceId + d0->bNrInPins);
3522 
3523 	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3524 	    d0->bUnitId, d0->bNrInPins);
3525 
3526 	if (sc->sc_uq_au_no_xu) {
3527 		return;
3528 	}
3529 	if (d1->bControlSize == 0) {
3530 		return;
3531 	}
3532 	if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) {
3533 
3534 		memset(&MIX(sc), 0, sizeof(MIX(sc)));
3535 
3536 		MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3537 		MIX(sc).nchan = 1;
3538 		MIX(sc).wValue[0] = MAKE_WORD(UA_EXT_ENABLE, 0);
3539 		uaudio_mixer_determine_class(&iot[id], &MIX(sc));
3540 		MIX(sc).type = MIX_ON_OFF;
3541 
3542 		uaudio_mixer_add_ctl(sc, &MIX(sc));
3543 	}
3544 }
3545 
3546 static const void *
3547 uaudio_mixer_verify_desc(const void *arg, uint32_t len)
3548 {
3549 	const struct usb_audio_mixer_unit_1 *d1;
3550 	const struct usb_audio_extension_unit_1 *e1;
3551 	const struct usb_audio_processing_unit_1 *u1;
3552 
3553 	union {
3554 		const struct usb_descriptor *desc;
3555 		const struct usb_audio_input_terminal *it;
3556 		const struct usb_audio_output_terminal *ot;
3557 		const struct usb_audio_mixer_unit_0 *mu;
3558 		const struct usb_audio_selector_unit *su;
3559 		const struct usb_audio_feature_unit *fu;
3560 		const struct usb_audio_processing_unit_0 *pu;
3561 		const struct usb_audio_extension_unit_0 *eu;
3562 	}     u;
3563 
3564 	u.desc = arg;
3565 
3566 	if (u.desc == NULL) {
3567 		goto error;
3568 	}
3569 	if (u.desc->bDescriptorType != UDESC_CS_INTERFACE) {
3570 		goto error;
3571 	}
3572 	switch (u.desc->bDescriptorSubtype) {
3573 	case UDESCSUB_AC_INPUT:
3574 		len += sizeof(*u.it);
3575 		break;
3576 
3577 	case UDESCSUB_AC_OUTPUT:
3578 		len += sizeof(*u.ot);
3579 		break;
3580 
3581 	case UDESCSUB_AC_MIXER:
3582 		len += sizeof(*u.mu);
3583 
3584 		if (u.desc->bLength < len) {
3585 			goto error;
3586 		}
3587 		len += u.mu->bNrInPins;
3588 
3589 		if (u.desc->bLength < len) {
3590 			goto error;
3591 		}
3592 		d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins);
3593 
3594 		len += sizeof(*d1);
3595 		break;
3596 
3597 	case UDESCSUB_AC_SELECTOR:
3598 		len += sizeof(*u.su);
3599 
3600 		if (u.desc->bLength < len) {
3601 			goto error;
3602 		}
3603 		len += u.su->bNrInPins + 1;
3604 		break;
3605 
3606 	case UDESCSUB_AC_FEATURE:
3607 		len += sizeof(*u.fu) + 1;
3608 
3609 		if (u.desc->bLength < len)
3610 			goto error;
3611 
3612 		len += u.fu->bControlSize;
3613 		break;
3614 
3615 	case UDESCSUB_AC_PROCESSING:
3616 		len += sizeof(*u.pu);
3617 
3618 		if (u.desc->bLength < len) {
3619 			goto error;
3620 		}
3621 		len += u.pu->bNrInPins;
3622 
3623 		if (u.desc->bLength < len) {
3624 			goto error;
3625 		}
3626 		u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins);
3627 
3628 		len += sizeof(*u1);
3629 
3630 		if (u.desc->bLength < len) {
3631 			goto error;
3632 		}
3633 		len += u1->bControlSize;
3634 
3635 		break;
3636 
3637 	case UDESCSUB_AC_EXTENSION:
3638 		len += sizeof(*u.eu);
3639 
3640 		if (u.desc->bLength < len) {
3641 			goto error;
3642 		}
3643 		len += u.eu->bNrInPins;
3644 
3645 		if (u.desc->bLength < len) {
3646 			goto error;
3647 		}
3648 		e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins);
3649 
3650 		len += sizeof(*e1);
3651 
3652 		if (u.desc->bLength < len) {
3653 			goto error;
3654 		}
3655 		len += e1->bControlSize;
3656 		break;
3657 
3658 	default:
3659 		goto error;
3660 	}
3661 
3662 	if (u.desc->bLength < len) {
3663 		goto error;
3664 	}
3665 	return (u.desc);
3666 
3667 error:
3668 	if (u.desc) {
3669 		DPRINTF("invalid descriptor, type=%d, "
3670 		    "sub_type=%d, len=%d of %d bytes\n",
3671 		    u.desc->bDescriptorType,
3672 		    u.desc->bDescriptorSubtype,
3673 		    u.desc->bLength, len);
3674 	}
3675 	return (NULL);
3676 }
3677 
3678 static const void *
3679 uaudio20_mixer_verify_desc(const void *arg, uint32_t len)
3680 {
3681 	const struct usb_audio20_mixer_unit_1 *d1;
3682 	const struct usb_audio20_extension_unit_1 *e1;
3683 	const struct usb_audio20_processing_unit_1 *u1;
3684 	const struct usb_audio20_clock_selector_unit_1 *c1;
3685 
3686 	union {
3687 		const struct usb_descriptor *desc;
3688 		const struct usb_audio20_clock_source_unit *csrc;
3689 		const struct usb_audio20_clock_selector_unit_0 *csel;
3690 		const struct usb_audio20_clock_multiplier_unit *cmul;
3691 		const struct usb_audio20_input_terminal *it;
3692 		const struct usb_audio20_output_terminal *ot;
3693 		const struct usb_audio20_mixer_unit_0 *mu;
3694 		const struct usb_audio20_selector_unit *su;
3695 		const struct usb_audio20_feature_unit *fu;
3696 		const struct usb_audio20_sample_rate_unit *ru;
3697 		const struct usb_audio20_processing_unit_0 *pu;
3698 		const struct usb_audio20_extension_unit_0 *eu;
3699 		const struct usb_audio20_effect_unit *ef;
3700 	}     u;
3701 
3702 	u.desc = arg;
3703 
3704 	if (u.desc == NULL)
3705 		goto error;
3706 
3707 	if (u.desc->bDescriptorType != UDESC_CS_INTERFACE)
3708 		goto error;
3709 
3710 	switch (u.desc->bDescriptorSubtype) {
3711 	case UDESCSUB_AC_INPUT:
3712 		len += sizeof(*u.it);
3713 		break;
3714 
3715 	case UDESCSUB_AC_OUTPUT:
3716 		len += sizeof(*u.ot);
3717 		break;
3718 
3719 	case UDESCSUB_AC_MIXER:
3720 		len += sizeof(*u.mu);
3721 
3722 		if (u.desc->bLength < len)
3723 			goto error;
3724 		len += u.mu->bNrInPins;
3725 
3726 		if (u.desc->bLength < len)
3727 			goto error;
3728 
3729 		d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins);
3730 
3731 		len += sizeof(*d1) + d1->bNrChannels;
3732 		break;
3733 
3734 	case UDESCSUB_AC_SELECTOR:
3735 		len += sizeof(*u.su);
3736 
3737 		if (u.desc->bLength < len)
3738 			goto error;
3739 
3740 		len += u.su->bNrInPins + 1;
3741 		break;
3742 
3743 	case UDESCSUB_AC_FEATURE:
3744 		len += sizeof(*u.fu) + 1;
3745 		break;
3746 
3747 	case UDESCSUB_AC_EFFECT:
3748 		len += sizeof(*u.ef) + 4;
3749 		break;
3750 
3751 	case UDESCSUB_AC_PROCESSING_V2:
3752 		len += sizeof(*u.pu);
3753 
3754 		if (u.desc->bLength < len)
3755 			goto error;
3756 
3757 		len += u.pu->bNrInPins;
3758 
3759 		if (u.desc->bLength < len)
3760 			goto error;
3761 
3762 		u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins);
3763 
3764 		len += sizeof(*u1);
3765 		break;
3766 
3767 	case UDESCSUB_AC_EXTENSION_V2:
3768 		len += sizeof(*u.eu);
3769 
3770 		if (u.desc->bLength < len)
3771 			goto error;
3772 
3773 		len += u.eu->bNrInPins;
3774 
3775 		if (u.desc->bLength < len)
3776 			goto error;
3777 
3778 		e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins);
3779 
3780 		len += sizeof(*e1);
3781 		break;
3782 
3783 	case UDESCSUB_AC_CLOCK_SRC:
3784 		len += sizeof(*u.csrc);
3785 		break;
3786 
3787 	case UDESCSUB_AC_CLOCK_SEL:
3788 		len += sizeof(*u.csel);
3789 
3790 		if (u.desc->bLength < len)
3791 			goto error;
3792 
3793 		len += u.csel->bNrInPins;
3794 
3795 		if (u.desc->bLength < len)
3796 			goto error;
3797 
3798 		c1 = (const void *)(u.csel->baCSourceId + u.csel->bNrInPins);
3799 
3800 		len += sizeof(*c1);
3801 		break;
3802 
3803 	case UDESCSUB_AC_CLOCK_MUL:
3804 		len += sizeof(*u.cmul);
3805 		break;
3806 
3807 	case UDESCSUB_AC_SAMPLE_RT:
3808 		len += sizeof(*u.ru);
3809 		break;
3810 
3811 	default:
3812 		goto error;
3813 	}
3814 
3815 	if (u.desc->bLength < len)
3816 		goto error;
3817 
3818 	return (u.desc);
3819 
3820 error:
3821 	if (u.desc) {
3822 		DPRINTF("invalid descriptor, type=%d, "
3823 		    "sub_type=%d, len=%d of %d bytes\n",
3824 		    u.desc->bDescriptorType,
3825 		    u.desc->bDescriptorSubtype,
3826 		    u.desc->bLength, len);
3827 	}
3828 	return (NULL);
3829 }
3830 
3831 static struct usb_audio_cluster
3832 uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
3833 {
3834 	struct usb_audio_cluster r;
3835 	const struct usb_descriptor *dp;
3836 	uint8_t i;
3837 
3838 	for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) {	/* avoid infinite loops */
3839 		dp = iot[id].u.desc;
3840 		if (dp == NULL) {
3841 			goto error;
3842 		}
3843 		switch (dp->bDescriptorSubtype) {
3844 		case UDESCSUB_AC_INPUT:
3845 			r.bNrChannels = iot[id].u.it_v1->bNrChannels;
3846 			r.wChannelConfig[0] = iot[id].u.it_v1->wChannelConfig[0];
3847 			r.wChannelConfig[1] = iot[id].u.it_v1->wChannelConfig[1];
3848 			r.iChannelNames = iot[id].u.it_v1->iChannelNames;
3849 			goto done;
3850 
3851 		case UDESCSUB_AC_OUTPUT:
3852 			id = iot[id].u.ot_v1->bSourceId;
3853 			break;
3854 
3855 		case UDESCSUB_AC_MIXER:
3856 			r = *(const struct usb_audio_cluster *)
3857 			    &iot[id].u.mu_v1->baSourceId[
3858 			    iot[id].u.mu_v1->bNrInPins];
3859 			goto done;
3860 
3861 		case UDESCSUB_AC_SELECTOR:
3862 			if (iot[id].u.su_v1->bNrInPins > 0) {
3863 				/* XXX This is not really right */
3864 				id = iot[id].u.su_v1->baSourceId[0];
3865 			}
3866 			break;
3867 
3868 		case UDESCSUB_AC_FEATURE:
3869 			id = iot[id].u.fu_v1->bSourceId;
3870 			break;
3871 
3872 		case UDESCSUB_AC_PROCESSING:
3873 			r = *((const struct usb_audio_cluster *)
3874 			    &iot[id].u.pu_v1->baSourceId[
3875 			    iot[id].u.pu_v1->bNrInPins]);
3876 			goto done;
3877 
3878 		case UDESCSUB_AC_EXTENSION:
3879 			r = *((const struct usb_audio_cluster *)
3880 			    &iot[id].u.eu_v1->baSourceId[
3881 			    iot[id].u.eu_v1->bNrInPins]);
3882 			goto done;
3883 
3884 		default:
3885 			goto error;
3886 		}
3887 	}
3888 error:
3889 	DPRINTF("bad data\n");
3890 	memset(&r, 0, sizeof(r));
3891 done:
3892 	return (r);
3893 }
3894 
3895 static struct usb_audio20_cluster
3896 uaudio20_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
3897 {
3898 	struct usb_audio20_cluster r;
3899 	const struct usb_descriptor *dp;
3900 	uint8_t i;
3901 
3902 	for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) {	/* avoid infinite loops */
3903 		dp = iot[id].u.desc;
3904 		if (dp == NULL)
3905 			goto error;
3906 
3907 		switch (dp->bDescriptorSubtype) {
3908 		case UDESCSUB_AC_INPUT:
3909 			r.bNrChannels = iot[id].u.it_v2->bNrChannels;
3910 			r.bmChannelConfig[0] = iot[id].u.it_v2->bmChannelConfig[0];
3911 			r.bmChannelConfig[1] = iot[id].u.it_v2->bmChannelConfig[1];
3912 			r.bmChannelConfig[2] = iot[id].u.it_v2->bmChannelConfig[2];
3913 			r.bmChannelConfig[3] = iot[id].u.it_v2->bmChannelConfig[3];
3914 			r.iChannelNames = iot[id].u.it_v2->iTerminal;
3915 			goto done;
3916 
3917 		case UDESCSUB_AC_OUTPUT:
3918 			id = iot[id].u.ot_v2->bSourceId;
3919 			break;
3920 
3921 		case UDESCSUB_AC_MIXER:
3922 			r = *(const struct usb_audio20_cluster *)
3923 			    &iot[id].u.mu_v2->baSourceId[
3924 			    iot[id].u.mu_v2->bNrInPins];
3925 			goto done;
3926 
3927 		case UDESCSUB_AC_SELECTOR:
3928 			if (iot[id].u.su_v2->bNrInPins > 0) {
3929 				/* XXX This is not really right */
3930 				id = iot[id].u.su_v2->baSourceId[0];
3931 			}
3932 			break;
3933 
3934 		case UDESCSUB_AC_SAMPLE_RT:
3935 			id = iot[id].u.ru_v2->bSourceId;
3936 			break;
3937 
3938 		case UDESCSUB_AC_EFFECT:
3939 			id = iot[id].u.ef_v2->bSourceId;
3940 			break;
3941 
3942 		case UDESCSUB_AC_FEATURE:
3943 			id = iot[id].u.fu_v2->bSourceId;
3944 			break;
3945 
3946 		case UDESCSUB_AC_PROCESSING_V2:
3947 			r = *((const struct usb_audio20_cluster *)
3948 			    &iot[id].u.pu_v2->baSourceId[
3949 			    iot[id].u.pu_v2->bNrInPins]);
3950 			goto done;
3951 
3952 		case UDESCSUB_AC_EXTENSION_V2:
3953 			r = *((const struct usb_audio20_cluster *)
3954 			    &iot[id].u.eu_v2->baSourceId[
3955 			    iot[id].u.eu_v2->bNrInPins]);
3956 			goto done;
3957 
3958 		default:
3959 			goto error;
3960 		}
3961 	}
3962 error:
3963 	DPRINTF("Bad data!\n");
3964 	memset(&r, 0, sizeof(r));
3965 done:
3966 	return (r);
3967 }
3968 
3969 static uint16_t
3970 uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot,
3971     struct uaudio_mixer_node *mix)
3972 {
3973 	uint16_t terminal_type = 0x0000;
3974 	const struct uaudio_terminal_node *input[2];
3975 	const struct uaudio_terminal_node *output[2];
3976 
3977 	input[0] = uaudio_mixer_get_input(iot, 0);
3978 	input[1] = uaudio_mixer_get_input(iot, 1);
3979 
3980 	output[0] = uaudio_mixer_get_output(iot, 0);
3981 	output[1] = uaudio_mixer_get_output(iot, 1);
3982 
3983 	/*
3984 	 * check if there is only
3985 	 * one output terminal:
3986 	 */
3987 	if (output[0] && (!output[1])) {
3988 		terminal_type =
3989 		    UGETW(output[0]->u.ot_v1->wTerminalType);
3990 	}
3991 	/*
3992 	 * If the only output terminal is USB,
3993 	 * the class is UAC_RECORD.
3994 	 */
3995 	if ((terminal_type & 0xff00) == (UAT_UNDEFINED & 0xff00)) {
3996 
3997 		mix->class = UAC_RECORD;
3998 		if (input[0] && (!input[1])) {
3999 			terminal_type =
4000 			    UGETW(input[0]->u.it_v1->wTerminalType);
4001 		} else {
4002 			terminal_type = 0;
4003 		}
4004 		goto done;
4005 	}
4006 	/*
4007 	 * if the unit is connected to just
4008 	 * one input terminal, the
4009 	 * class is UAC_INPUT:
4010 	 */
4011 	if (input[0] && (!input[1])) {
4012 		mix->class = UAC_INPUT;
4013 		terminal_type =
4014 		    UGETW(input[0]->u.it_v1->wTerminalType);
4015 		goto done;
4016 	}
4017 	/*
4018 	 * Otherwise, the class is UAC_OUTPUT.
4019 	 */
4020 	mix->class = UAC_OUTPUT;
4021 done:
4022 	return (terminal_type);
4023 }
4024 
4025 static uint16_t
4026 uaudio20_mixer_determine_class(const struct uaudio_terminal_node *iot,
4027     struct uaudio_mixer_node *mix)
4028 {
4029 	uint16_t terminal_type = 0x0000;
4030 	const struct uaudio_terminal_node *input[2];
4031 	const struct uaudio_terminal_node *output[2];
4032 
4033 	input[0] = uaudio_mixer_get_input(iot, 0);
4034 	input[1] = uaudio_mixer_get_input(iot, 1);
4035 
4036 	output[0] = uaudio_mixer_get_output(iot, 0);
4037 	output[1] = uaudio_mixer_get_output(iot, 1);
4038 
4039 	/*
4040 	 * check if there is only
4041 	 * one output terminal:
4042 	 */
4043 	if (output[0] && (!output[1]))
4044 		terminal_type = UGETW(output[0]->u.ot_v2->wTerminalType);
4045 	/*
4046 	 * If the only output terminal is USB,
4047 	 * the class is UAC_RECORD.
4048 	 */
4049 	if ((terminal_type & 0xff00) == (UAT_UNDEFINED & 0xff00)) {
4050 
4051 		mix->class = UAC_RECORD;
4052 		if (input[0] && (!input[1])) {
4053 			terminal_type =
4054 			    UGETW(input[0]->u.it_v2->wTerminalType);
4055 		} else {
4056 			terminal_type = 0;
4057 		}
4058 		goto done;
4059 	}
4060 	/*
4061 	 * if the unit is connected to just
4062 	 * one input terminal, the
4063 	 * class is UAC_INPUT:
4064 	 */
4065 	if (input[0] && (!input[1])) {
4066 		mix->class = UAC_INPUT;
4067 		terminal_type =
4068 		    UGETW(input[0]->u.it_v2->wTerminalType);
4069 		goto done;
4070 	}
4071 	/*
4072 	 * Otherwise, the class is UAC_OUTPUT.
4073 	 */
4074 	mix->class = UAC_OUTPUT;
4075 done:
4076 	return (terminal_type);
4077 }
4078 
4079 struct uaudio_tt_to_feature {
4080 	uint16_t terminal_type;
4081 	uint16_t feature;
4082 };
4083 
4084 static const struct uaudio_tt_to_feature uaudio_tt_to_feature[] = {
4085 
4086 	{UAT_STREAM, SOUND_MIXER_PCM},
4087 
4088 	{UATI_MICROPHONE, SOUND_MIXER_MIC},
4089 	{UATI_DESKMICROPHONE, SOUND_MIXER_MIC},
4090 	{UATI_PERSONALMICROPHONE, SOUND_MIXER_MIC},
4091 	{UATI_OMNIMICROPHONE, SOUND_MIXER_MIC},
4092 	{UATI_MICROPHONEARRAY, SOUND_MIXER_MIC},
4093 	{UATI_PROCMICROPHONEARR, SOUND_MIXER_MIC},
4094 
4095 	{UATO_SPEAKER, SOUND_MIXER_SPEAKER},
4096 	{UATO_DESKTOPSPEAKER, SOUND_MIXER_SPEAKER},
4097 	{UATO_ROOMSPEAKER, SOUND_MIXER_SPEAKER},
4098 	{UATO_COMMSPEAKER, SOUND_MIXER_SPEAKER},
4099 
4100 	{UATE_ANALOGCONN, SOUND_MIXER_LINE},
4101 	{UATE_LINECONN, SOUND_MIXER_LINE},
4102 	{UATE_LEGACYCONN, SOUND_MIXER_LINE},
4103 
4104 	{UATE_DIGITALAUIFC, SOUND_MIXER_ALTPCM},
4105 	{UATE_SPDIF, SOUND_MIXER_ALTPCM},
4106 	{UATE_1394DA, SOUND_MIXER_ALTPCM},
4107 	{UATE_1394DV, SOUND_MIXER_ALTPCM},
4108 
4109 	{UATF_CDPLAYER, SOUND_MIXER_CD},
4110 
4111 	{UATF_SYNTHESIZER, SOUND_MIXER_SYNTH},
4112 
4113 	{UATF_VIDEODISCAUDIO, SOUND_MIXER_VIDEO},
4114 	{UATF_DVDAUDIO, SOUND_MIXER_VIDEO},
4115 	{UATF_TVTUNERAUDIO, SOUND_MIXER_VIDEO},
4116 
4117 	/* telephony terminal types */
4118 	{UATT_UNDEFINED, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
4119 	{UATT_PHONELINE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
4120 	{UATT_TELEPHONE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
4121 	{UATT_DOWNLINEPHONE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
4122 
4123 	{UATF_RADIORECV, SOUND_MIXER_RADIO},
4124 	{UATF_RADIOXMIT, SOUND_MIXER_RADIO},
4125 
4126 	{UAT_UNDEFINED, SOUND_MIXER_VOLUME},
4127 	{UAT_VENDOR, SOUND_MIXER_VOLUME},
4128 	{UATI_UNDEFINED, SOUND_MIXER_VOLUME},
4129 
4130 	/* output terminal types */
4131 	{UATO_UNDEFINED, SOUND_MIXER_VOLUME},
4132 	{UATO_DISPLAYAUDIO, SOUND_MIXER_VOLUME},
4133 	{UATO_SUBWOOFER, SOUND_MIXER_VOLUME},
4134 	{UATO_HEADPHONES, SOUND_MIXER_VOLUME},
4135 
4136 	/* bidir terminal types */
4137 	{UATB_UNDEFINED, SOUND_MIXER_VOLUME},
4138 	{UATB_HANDSET, SOUND_MIXER_VOLUME},
4139 	{UATB_HEADSET, SOUND_MIXER_VOLUME},
4140 	{UATB_SPEAKERPHONE, SOUND_MIXER_VOLUME},
4141 	{UATB_SPEAKERPHONEESUP, SOUND_MIXER_VOLUME},
4142 	{UATB_SPEAKERPHONEECANC, SOUND_MIXER_VOLUME},
4143 
4144 	/* external terminal types */
4145 	{UATE_UNDEFINED, SOUND_MIXER_VOLUME},
4146 
4147 	/* embedded function terminal types */
4148 	{UATF_UNDEFINED, SOUND_MIXER_VOLUME},
4149 	{UATF_CALIBNOISE, SOUND_MIXER_VOLUME},
4150 	{UATF_EQUNOISE, SOUND_MIXER_VOLUME},
4151 	{UATF_DAT, SOUND_MIXER_VOLUME},
4152 	{UATF_DCC, SOUND_MIXER_VOLUME},
4153 	{UATF_MINIDISK, SOUND_MIXER_VOLUME},
4154 	{UATF_ANALOGTAPE, SOUND_MIXER_VOLUME},
4155 	{UATF_PHONOGRAPH, SOUND_MIXER_VOLUME},
4156 	{UATF_VCRAUDIO, SOUND_MIXER_VOLUME},
4157 	{UATF_SATELLITE, SOUND_MIXER_VOLUME},
4158 	{UATF_CABLETUNER, SOUND_MIXER_VOLUME},
4159 	{UATF_DSS, SOUND_MIXER_VOLUME},
4160 	{UATF_MULTITRACK, SOUND_MIXER_VOLUME},
4161 	{0xffff, SOUND_MIXER_VOLUME},
4162 
4163 	/* default */
4164 	{0x0000, SOUND_MIXER_VOLUME},
4165 };
4166 
4167 static uint16_t
4168 uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot,
4169     struct uaudio_mixer_node *mix)
4170 {
4171 	const struct uaudio_tt_to_feature *uat = uaudio_tt_to_feature;
4172 	uint16_t terminal_type = uaudio_mixer_determine_class(iot, mix);
4173 
4174 	if ((mix->class == UAC_RECORD) && (terminal_type == 0)) {
4175 		return (SOUND_MIXER_IMIX);
4176 	}
4177 	while (uat->terminal_type) {
4178 		if (uat->terminal_type == terminal_type) {
4179 			break;
4180 		}
4181 		uat++;
4182 	}
4183 
4184 	DPRINTF("terminal_type=0x%04x -> %d\n",
4185 	    terminal_type, uat->feature);
4186 
4187 	return (uat->feature);
4188 }
4189 
4190 static uint16_t
4191 uaudio20_mixer_feature_name(const struct uaudio_terminal_node *iot,
4192     struct uaudio_mixer_node *mix)
4193 {
4194 	const struct uaudio_tt_to_feature *uat;
4195 	uint16_t terminal_type = uaudio20_mixer_determine_class(iot, mix);
4196 
4197 	if ((mix->class == UAC_RECORD) && (terminal_type == 0))
4198 		return (SOUND_MIXER_IMIX);
4199 
4200 	for (uat = uaudio_tt_to_feature; uat->terminal_type != 0; uat++) {
4201 		if (uat->terminal_type == terminal_type)
4202 			break;
4203 	}
4204 
4205 	DPRINTF("terminal_type=0x%04x -> %d\n",
4206 	    terminal_type, uat->feature);
4207 
4208 	return (uat->feature);
4209 }
4210 
4211 static const struct uaudio_terminal_node *
4212 uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t i)
4213 {
4214 	struct uaudio_terminal_node *root = iot->root;
4215 	uint8_t n;
4216 
4217 	n = iot->usr.id_max;
4218 	do {
4219 		if (iot->usr.bit_input[n / 8] & (1 << (n % 8))) {
4220 			if (!i--)
4221 				return (root + n);
4222 		}
4223 	} while (n--);
4224 
4225 	return (NULL);
4226 }
4227 
4228 static const struct uaudio_terminal_node *
4229 uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, uint8_t i)
4230 {
4231 	struct uaudio_terminal_node *root = iot->root;
4232 	uint8_t n;
4233 
4234 	n = iot->usr.id_max;
4235 	do {
4236 		if (iot->usr.bit_output[n / 8] & (1 << (n % 8))) {
4237 			if (!i--)
4238 				return (root + n);
4239 		}
4240 	} while (n--);
4241 
4242 	return (NULL);
4243 }
4244 
4245 static void
4246 uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
4247     const uint8_t *p_id, uint8_t n_id,
4248     struct uaudio_search_result *info)
4249 {
4250 	struct uaudio_terminal_node *iot;
4251 	uint8_t n;
4252 	uint8_t i;
4253 	uint8_t is_last;
4254 
4255 top:
4256 	for (n = 0; n < n_id; n++) {
4257 
4258 		i = p_id[n];
4259 
4260 		if (info->recurse_level == UAUDIO_RECURSE_LIMIT) {
4261 			DPRINTF("avoided going into a circle at id=%d!\n", i);
4262 			return;
4263 		}
4264 
4265 		info->recurse_level++;
4266 
4267 		iot = (root + i);
4268 
4269 		if (iot->u.desc == NULL)
4270 			continue;
4271 
4272 		is_last = ((n + 1) == n_id);
4273 
4274 		switch (iot->u.desc->bDescriptorSubtype) {
4275 		case UDESCSUB_AC_INPUT:
4276 			info->bit_input[i / 8] |= (1 << (i % 8));
4277 			break;
4278 
4279 		case UDESCSUB_AC_FEATURE:
4280 			if (is_last) {
4281 				p_id = &iot->u.fu_v1->bSourceId;
4282 				n_id = 1;
4283 				goto top;
4284 			}
4285 			uaudio_mixer_find_inputs_sub(
4286 			    root, &iot->u.fu_v1->bSourceId, 1, info);
4287 			break;
4288 
4289 		case UDESCSUB_AC_OUTPUT:
4290 			if (is_last) {
4291 				p_id = &iot->u.ot_v1->bSourceId;
4292 				n_id = 1;
4293 				goto top;
4294 			}
4295 			uaudio_mixer_find_inputs_sub(
4296 			    root, &iot->u.ot_v1->bSourceId, 1, info);
4297 			break;
4298 
4299 		case UDESCSUB_AC_MIXER:
4300 			if (is_last) {
4301 				p_id = iot->u.mu_v1->baSourceId;
4302 				n_id = iot->u.mu_v1->bNrInPins;
4303 				goto top;
4304 			}
4305 			uaudio_mixer_find_inputs_sub(
4306 			    root, iot->u.mu_v1->baSourceId,
4307 			    iot->u.mu_v1->bNrInPins, info);
4308 			break;
4309 
4310 		case UDESCSUB_AC_SELECTOR:
4311 			if (is_last) {
4312 				p_id = iot->u.su_v1->baSourceId;
4313 				n_id = iot->u.su_v1->bNrInPins;
4314 				goto top;
4315 			}
4316 			uaudio_mixer_find_inputs_sub(
4317 			    root, iot->u.su_v1->baSourceId,
4318 			    iot->u.su_v1->bNrInPins, info);
4319 			break;
4320 
4321 		case UDESCSUB_AC_PROCESSING:
4322 			if (is_last) {
4323 				p_id = iot->u.pu_v1->baSourceId;
4324 				n_id = iot->u.pu_v1->bNrInPins;
4325 				goto top;
4326 			}
4327 			uaudio_mixer_find_inputs_sub(
4328 			    root, iot->u.pu_v1->baSourceId,
4329 			    iot->u.pu_v1->bNrInPins, info);
4330 			break;
4331 
4332 		case UDESCSUB_AC_EXTENSION:
4333 			if (is_last) {
4334 				p_id = iot->u.eu_v1->baSourceId;
4335 				n_id = iot->u.eu_v1->bNrInPins;
4336 				goto top;
4337 			}
4338 			uaudio_mixer_find_inputs_sub(
4339 			    root, iot->u.eu_v1->baSourceId,
4340 			    iot->u.eu_v1->bNrInPins, info);
4341 			break;
4342 
4343 		default:
4344 			break;
4345 		}
4346 	}
4347 }
4348 
4349 static void
4350 uaudio20_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
4351     const uint8_t *p_id, uint8_t n_id,
4352     struct uaudio_search_result *info)
4353 {
4354 	struct uaudio_terminal_node *iot;
4355 	uint8_t n;
4356 	uint8_t i;
4357 	uint8_t is_last;
4358 
4359 top:
4360 	for (n = 0; n < n_id; n++) {
4361 
4362 		i = p_id[n];
4363 
4364 		if (info->recurse_level == UAUDIO_RECURSE_LIMIT) {
4365 			DPRINTF("avoided going into a circle at id=%d!\n", i);
4366 			return;
4367 		}
4368 
4369 		info->recurse_level++;
4370 
4371 		iot = (root + i);
4372 
4373 		if (iot->u.desc == NULL)
4374 			continue;
4375 
4376 		is_last = ((n + 1) == n_id);
4377 
4378 		switch (iot->u.desc->bDescriptorSubtype) {
4379 		case UDESCSUB_AC_INPUT:
4380 			info->bit_input[i / 8] |= (1 << (i % 8));
4381 			break;
4382 
4383 		case UDESCSUB_AC_OUTPUT:
4384 			if (is_last) {
4385 				p_id = &iot->u.ot_v2->bSourceId;
4386 				n_id = 1;
4387 				goto top;
4388 			}
4389 			uaudio20_mixer_find_inputs_sub(
4390 			    root, &iot->u.ot_v2->bSourceId, 1, info);
4391 			break;
4392 
4393 		case UDESCSUB_AC_MIXER:
4394 			if (is_last) {
4395 				p_id = iot->u.mu_v2->baSourceId;
4396 				n_id = iot->u.mu_v2->bNrInPins;
4397 				goto top;
4398 			}
4399 			uaudio20_mixer_find_inputs_sub(
4400 			    root, iot->u.mu_v2->baSourceId,
4401 			    iot->u.mu_v2->bNrInPins, info);
4402 			break;
4403 
4404 		case UDESCSUB_AC_SELECTOR:
4405 			if (is_last) {
4406 				p_id = iot->u.su_v2->baSourceId;
4407 				n_id = iot->u.su_v2->bNrInPins;
4408 				goto top;
4409 			}
4410 			uaudio20_mixer_find_inputs_sub(
4411 			    root, iot->u.su_v2->baSourceId,
4412 			    iot->u.su_v2->bNrInPins, info);
4413 			break;
4414 
4415 		case UDESCSUB_AC_SAMPLE_RT:
4416 			if (is_last) {
4417 				p_id = &iot->u.ru_v2->bSourceId;
4418 				n_id = 1;
4419 				goto top;
4420 			}
4421 			uaudio20_mixer_find_inputs_sub(
4422 			    root, &iot->u.ru_v2->bSourceId,
4423 			    1, info);
4424 			break;
4425 
4426 		case UDESCSUB_AC_EFFECT:
4427 			if (is_last) {
4428 				p_id = &iot->u.ef_v2->bSourceId;
4429 				n_id = 1;
4430 				goto top;
4431 			}
4432 			uaudio20_mixer_find_inputs_sub(
4433 			    root, &iot->u.ef_v2->bSourceId,
4434 			    1, info);
4435 			break;
4436 
4437 		case UDESCSUB_AC_FEATURE:
4438 			if (is_last) {
4439 				p_id = &iot->u.fu_v2->bSourceId;
4440 				n_id = 1;
4441 				goto top;
4442 			}
4443 			uaudio20_mixer_find_inputs_sub(
4444 			    root, &iot->u.fu_v2->bSourceId, 1, info);
4445 			break;
4446 
4447 		case UDESCSUB_AC_PROCESSING_V2:
4448 			if (is_last) {
4449 				p_id = iot->u.pu_v2->baSourceId;
4450 				n_id = iot->u.pu_v2->bNrInPins;
4451 				goto top;
4452 			}
4453 			uaudio20_mixer_find_inputs_sub(
4454 			    root, iot->u.pu_v2->baSourceId,
4455 			    iot->u.pu_v2->bNrInPins, info);
4456 			break;
4457 
4458 		case UDESCSUB_AC_EXTENSION_V2:
4459 			if (is_last) {
4460 				p_id = iot->u.eu_v2->baSourceId;
4461 				n_id = iot->u.eu_v2->bNrInPins;
4462 				goto top;
4463 			}
4464 			uaudio20_mixer_find_inputs_sub(
4465 			    root, iot->u.eu_v2->baSourceId,
4466 			    iot->u.eu_v2->bNrInPins, info);
4467 			break;
4468 		default:
4469 			break;
4470 		}
4471 	}
4472 }
4473 
4474 static void
4475 uaudio20_mixer_find_clocks_sub(struct uaudio_terminal_node *root,
4476     const uint8_t *p_id, uint8_t n_id,
4477     struct uaudio_search_result *info)
4478 {
4479 	struct uaudio_terminal_node *iot;
4480 	uint8_t n;
4481 	uint8_t i;
4482 	uint8_t is_last;
4483 	uint8_t id;
4484 
4485 top:
4486 	for (n = 0; n < n_id; n++) {
4487 
4488 		i = p_id[n];
4489 
4490 		if (info->recurse_level == UAUDIO_RECURSE_LIMIT) {
4491 			DPRINTF("avoided going into a circle at id=%d!\n", i);
4492 			return;
4493 		}
4494 
4495 		info->recurse_level++;
4496 
4497 		iot = (root + i);
4498 
4499 		if (iot->u.desc == NULL)
4500 			continue;
4501 
4502 		is_last = ((n + 1) == n_id);
4503 
4504 		switch (iot->u.desc->bDescriptorSubtype) {
4505 		case UDESCSUB_AC_INPUT:
4506 			info->is_input = 1;
4507 			if (is_last) {
4508 				p_id = &iot->u.it_v2->bCSourceId;
4509 				n_id = 1;
4510 				goto top;
4511 			}
4512 			uaudio20_mixer_find_clocks_sub(root,
4513 			    &iot->u.it_v2->bCSourceId, 1, info);
4514 			break;
4515 
4516 		case UDESCSUB_AC_OUTPUT:
4517 			info->is_input = 0;
4518 			if (is_last) {
4519 				p_id = &iot->u.ot_v2->bCSourceId;
4520 				n_id = 1;
4521 				goto top;
4522 			}
4523 			uaudio20_mixer_find_clocks_sub(root,
4524 			    &iot->u.ot_v2->bCSourceId, 1, info);
4525 			break;
4526 
4527 		case UDESCSUB_AC_CLOCK_SEL:
4528 			if (is_last) {
4529 				p_id = iot->u.csel_v2->baCSourceId;
4530 				n_id = iot->u.csel_v2->bNrInPins;
4531 				goto top;
4532 			}
4533 			uaudio20_mixer_find_clocks_sub(root,
4534 			    iot->u.csel_v2->baCSourceId,
4535 			    iot->u.csel_v2->bNrInPins, info);
4536 			break;
4537 
4538 		case UDESCSUB_AC_CLOCK_MUL:
4539 			if (is_last) {
4540 				p_id = &iot->u.cmul_v2->bCSourceId;
4541 				n_id = 1;
4542 				goto top;
4543 			}
4544 			uaudio20_mixer_find_clocks_sub(root,
4545 			    &iot->u.cmul_v2->bCSourceId,
4546 			    1, info);
4547 			break;
4548 
4549 		case UDESCSUB_AC_CLOCK_SRC:
4550 
4551 			id = iot->u.csrc_v2->bClockId;
4552 
4553 			switch (info->is_input) {
4554 			case 0:
4555 				info->bit_output[id / 8] |= (1 << (id % 8));
4556 				break;
4557 			case 1:
4558 				info->bit_input[id / 8] |= (1 << (id % 8));
4559 				break;
4560 			default:
4561 				break;
4562 			}
4563 			break;
4564 
4565 		default:
4566 			break;
4567 		}
4568 	}
4569 }
4570 
4571 static void
4572 uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id,
4573     uint8_t n_id, struct uaudio_search_result *info)
4574 {
4575 	struct uaudio_terminal_node *iot = (root + id);
4576 	uint8_t j;
4577 
4578 	j = n_id;
4579 	do {
4580 		if ((j != id) && ((root + j)->u.desc) &&
4581 		    ((root + j)->u.desc->bDescriptorSubtype == UDESCSUB_AC_OUTPUT)) {
4582 
4583 			/*
4584 			 * "j" (output) <--- virtual wire <--- "id" (input)
4585 			 *
4586 			 * if "j" has "id" on the input, then "id" have "j" on
4587 			 * the output, because they are connected:
4588 			 */
4589 			if ((root + j)->usr.bit_input[id / 8] & (1 << (id % 8))) {
4590 				iot->usr.bit_output[j / 8] |= (1 << (j % 8));
4591 			}
4592 		}
4593 	} while (j--);
4594 }
4595 
4596 static void
4597 uaudio_mixer_fill_info(struct uaudio_softc *sc,
4598     struct usb_device *udev, void *desc)
4599 {
4600 	const struct usb_audio_control_descriptor *acdp;
4601 	struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
4602 	const struct usb_descriptor *dp;
4603 	const struct usb_audio_unit *au;
4604 	struct uaudio_terminal_node *iot = NULL;
4605 	uint16_t wTotalLen;
4606 	uint8_t ID_max = 0;		/* inclusive */
4607 	uint8_t i;
4608 
4609 	desc = usb_desc_foreach(cd, desc);
4610 
4611 	if (desc == NULL) {
4612 		DPRINTF("no Audio Control header\n");
4613 		goto done;
4614 	}
4615 	acdp = desc;
4616 
4617 	if ((acdp->bLength < sizeof(*acdp)) ||
4618 	    (acdp->bDescriptorType != UDESC_CS_INTERFACE) ||
4619 	    (acdp->bDescriptorSubtype != UDESCSUB_AC_HEADER)) {
4620 		DPRINTF("invalid Audio Control header\n");
4621 		goto done;
4622 	}
4623 	/* "wTotalLen" is allowed to be corrupt */
4624 	wTotalLen = UGETW(acdp->wTotalLength) - acdp->bLength;
4625 
4626 	/* get USB audio revision */
4627 	sc->sc_audio_rev = UGETW(acdp->bcdADC);
4628 
4629 	DPRINTFN(3, "found AC header, vers=%03x, len=%d\n",
4630 	    sc->sc_audio_rev, wTotalLen);
4631 
4632 	iot = malloc(sizeof(struct uaudio_terminal_node) * 256, M_TEMP,
4633 	    M_WAITOK | M_ZERO);
4634 
4635 	if (iot == NULL) {
4636 		DPRINTF("no memory!\n");
4637 		goto done;
4638 	}
4639 	while ((desc = usb_desc_foreach(cd, desc))) {
4640 
4641 		dp = desc;
4642 
4643 		if (dp->bLength > wTotalLen) {
4644 			break;
4645 		} else {
4646 			wTotalLen -= dp->bLength;
4647 		}
4648 
4649 		if (sc->sc_audio_rev >= UAUDIO_VERSION_30)
4650 			au = NULL;
4651 		else if (sc->sc_audio_rev >= UAUDIO_VERSION_20)
4652 			au = uaudio20_mixer_verify_desc(dp, 0);
4653 		else
4654 			au = uaudio_mixer_verify_desc(dp, 0);
4655 
4656 		if (au) {
4657 			iot[au->bUnitId].u.desc = (const void *)au;
4658 			if (au->bUnitId > ID_max)
4659 				ID_max = au->bUnitId;
4660 		}
4661 	}
4662 
4663 	DPRINTF("Maximum ID=%d\n", ID_max);
4664 
4665 	/*
4666 	 * determine sourcing inputs for
4667 	 * all nodes in the tree:
4668 	 */
4669 	i = ID_max;
4670 	do {
4671 		if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
4672 			/* FALLTHROUGH */
4673 		} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
4674 			uaudio20_mixer_find_inputs_sub(iot,
4675 			    &i, 1, &((iot + i)->usr));
4676 
4677 			sc->sc_mixer_clocks.is_input = 255;
4678 			sc->sc_mixer_clocks.recurse_level = 0;
4679 
4680 			uaudio20_mixer_find_clocks_sub(iot,
4681 			    &i, 1, &sc->sc_mixer_clocks);
4682 		} else {
4683 			uaudio_mixer_find_inputs_sub(iot,
4684 			    &i, 1, &((iot + i)->usr));
4685 		}
4686 	} while (i--);
4687 
4688 	/*
4689 	 * determine outputs for
4690 	 * all nodes in the tree:
4691 	 */
4692 	i = ID_max;
4693 	do {
4694 		uaudio_mixer_find_outputs_sub(iot,
4695 		    i, ID_max, &((iot + i)->usr));
4696 	} while (i--);
4697 
4698 	/* set "id_max" and "root" */
4699 
4700 	i = ID_max;
4701 	do {
4702 		(iot + i)->usr.id_max = ID_max;
4703 		(iot + i)->root = iot;
4704 	} while (i--);
4705 
4706 	/*
4707 	 * Scan the config to create a linked list of "mixer" nodes:
4708 	 */
4709 
4710 	i = ID_max;
4711 	do {
4712 		dp = iot[i].u.desc;
4713 
4714 		if (dp == NULL)
4715 			continue;
4716 
4717 		DPRINTFN(11, "id=%d subtype=%d\n",
4718 		    i, dp->bDescriptorSubtype);
4719 
4720 		if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
4721 			continue;
4722 		} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
4723 
4724 			switch (dp->bDescriptorSubtype) {
4725 			case UDESCSUB_AC_HEADER:
4726 				DPRINTF("unexpected AC header\n");
4727 				break;
4728 
4729 			case UDESCSUB_AC_INPUT:
4730 			case UDESCSUB_AC_OUTPUT:
4731 			case UDESCSUB_AC_PROCESSING_V2:
4732 			case UDESCSUB_AC_EXTENSION_V2:
4733 			case UDESCSUB_AC_EFFECT:
4734 			case UDESCSUB_AC_CLOCK_SRC:
4735 			case UDESCSUB_AC_CLOCK_SEL:
4736 			case UDESCSUB_AC_CLOCK_MUL:
4737 			case UDESCSUB_AC_SAMPLE_RT:
4738 				break;
4739 
4740 			case UDESCSUB_AC_MIXER:
4741 				uaudio20_mixer_add_mixer(sc, iot, i);
4742 				break;
4743 
4744 			case UDESCSUB_AC_SELECTOR:
4745 				uaudio20_mixer_add_selector(sc, iot, i);
4746 				break;
4747 
4748 			case UDESCSUB_AC_FEATURE:
4749 				uaudio20_mixer_add_feature(sc, iot, i);
4750 				break;
4751 
4752 			default:
4753 				DPRINTF("bad AC desc subtype=0x%02x\n",
4754 				    dp->bDescriptorSubtype);
4755 				break;
4756 			}
4757 			continue;
4758 		}
4759 
4760 		switch (dp->bDescriptorSubtype) {
4761 		case UDESCSUB_AC_HEADER:
4762 			DPRINTF("unexpected AC header\n");
4763 			break;
4764 
4765 		case UDESCSUB_AC_INPUT:
4766 		case UDESCSUB_AC_OUTPUT:
4767 			break;
4768 
4769 		case UDESCSUB_AC_MIXER:
4770 			uaudio_mixer_add_mixer(sc, iot, i);
4771 			break;
4772 
4773 		case UDESCSUB_AC_SELECTOR:
4774 			uaudio_mixer_add_selector(sc, iot, i);
4775 			break;
4776 
4777 		case UDESCSUB_AC_FEATURE:
4778 			uaudio_mixer_add_feature(sc, iot, i);
4779 			break;
4780 
4781 		case UDESCSUB_AC_PROCESSING:
4782 			uaudio_mixer_add_processing(sc, iot, i);
4783 			break;
4784 
4785 		case UDESCSUB_AC_EXTENSION:
4786 			uaudio_mixer_add_extension(sc, iot, i);
4787 			break;
4788 
4789 		default:
4790 			DPRINTF("bad AC desc subtype=0x%02x\n",
4791 			    dp->bDescriptorSubtype);
4792 			break;
4793 		}
4794 
4795 	} while (i--);
4796 
4797 done:
4798 	free(iot, M_TEMP);
4799 }
4800 
4801 static int
4802 uaudio_mixer_get(struct usb_device *udev, uint16_t audio_rev,
4803     uint8_t what, struct uaudio_mixer_node *mc)
4804 {
4805 	struct usb_device_request req;
4806 	int val;
4807 	uint8_t data[2 + (2 * 3)];
4808 	usb_error_t err;
4809 
4810 	if (mc->wValue[0] == -1)
4811 		return (0);
4812 
4813 	if (audio_rev >= UAUDIO_VERSION_30)
4814 		return (0);
4815 	else if (audio_rev >= UAUDIO_VERSION_20) {
4816 		if (what == GET_CUR) {
4817 			req.bRequest = UA20_CS_CUR;
4818 			USETW(req.wLength, 2);
4819 		} else {
4820 			req.bRequest = UA20_CS_RANGE;
4821 			USETW(req.wLength, 8);
4822 		}
4823 	} else {
4824 		uint16_t len = MIX_SIZE(mc->type);
4825 
4826 		req.bRequest = what;
4827 		USETW(req.wLength, len);
4828 	}
4829 
4830 	req.bmRequestType = UT_READ_CLASS_INTERFACE;
4831 	USETW(req.wValue, mc->wValue[0]);
4832 	USETW(req.wIndex, mc->wIndex);
4833 
4834 	memset(data, 0, sizeof(data));
4835 
4836 	err = usbd_do_request(udev, NULL, &req, data);
4837 	if (err) {
4838 		DPRINTF("err=%s\n", usbd_errstr(err));
4839 		return (0);
4840 	}
4841 
4842 	if (audio_rev >= UAUDIO_VERSION_30) {
4843 		val = 0;
4844 	} else if (audio_rev >= UAUDIO_VERSION_20) {
4845 		switch (what) {
4846 		case GET_CUR:
4847 			val = (data[0] | (data[1] << 8));
4848 			break;
4849 		case GET_MIN:
4850 			val = (data[2] | (data[3] << 8));
4851 			break;
4852 		case GET_MAX:
4853 			val = (data[4] | (data[5] << 8));
4854 			break;
4855 		case GET_RES:
4856 			val = (data[6] | (data[7] << 8));
4857 			break;
4858 		default:
4859 			val = 0;
4860 			break;
4861 		}
4862 	} else {
4863 		val = (data[0] | (data[1] << 8));
4864 	}
4865 
4866 	if (what == GET_CUR || what == GET_MIN || what == GET_MAX)
4867 		val = uaudio_mixer_signext(mc->type, val);
4868 
4869 	DPRINTFN(3, "val=%d\n", val);
4870 
4871 	return (val);
4872 }
4873 
4874 static void
4875 uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer, usb_error_t error)
4876 {
4877 	struct usb_device_request req;
4878 	struct uaudio_softc *sc = usbd_xfer_softc(xfer);
4879 	struct uaudio_mixer_node *mc = sc->sc_mixer_curr;
4880 	struct usb_page_cache *pc;
4881 	uint16_t len;
4882 	uint8_t repeat = 1;
4883 	uint8_t update;
4884 	uint8_t chan;
4885 	uint8_t buf[2];
4886 
4887 	DPRINTF("\n");
4888 
4889 	switch (USB_GET_STATE(xfer)) {
4890 	case USB_ST_TRANSFERRED:
4891 tr_transferred:
4892 	case USB_ST_SETUP:
4893 tr_setup:
4894 
4895 		if (mc == NULL) {
4896 			mc = sc->sc_mixer_root;
4897 			sc->sc_mixer_curr = mc;
4898 			sc->sc_mixer_chan = 0;
4899 			repeat = 0;
4900 		}
4901 		while (mc) {
4902 			while (sc->sc_mixer_chan < mc->nchan) {
4903 
4904 				chan = sc->sc_mixer_chan;
4905 
4906 				sc->sc_mixer_chan++;
4907 
4908 				update = ((mc->update[chan / 8] & (1 << (chan % 8))) &&
4909 				    (mc->wValue[chan] != -1));
4910 
4911 				mc->update[chan / 8] &= ~(1 << (chan % 8));
4912 
4913 				if (update) {
4914 
4915 					req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
4916 					USETW(req.wValue, mc->wValue[chan]);
4917 					USETW(req.wIndex, mc->wIndex);
4918 
4919 					if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
4920 						return;
4921 					} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
4922 						len = 2;
4923 						req.bRequest = UA20_CS_CUR;
4924 						USETW(req.wLength, len);
4925 					} else {
4926 						len = MIX_SIZE(mc->type);
4927 						req.bRequest = SET_CUR;
4928 						USETW(req.wLength, len);
4929 					}
4930 
4931 					buf[0] = (mc->wData[chan] & 0xFF);
4932 					buf[1] = (mc->wData[chan] >> 8) & 0xFF;
4933 
4934 					pc = usbd_xfer_get_frame(xfer, 0);
4935 					usbd_copy_in(pc, 0, &req, sizeof(req));
4936 					pc = usbd_xfer_get_frame(xfer, 1);
4937 					usbd_copy_in(pc, 0, buf, len);
4938 
4939 					usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
4940 					usbd_xfer_set_frame_len(xfer, 1, len);
4941 					usbd_xfer_set_frames(xfer, len ? 2 : 1);
4942 					usbd_transfer_submit(xfer);
4943 					return;
4944 				}
4945 			}
4946 
4947 			mc = mc->next;
4948 			sc->sc_mixer_curr = mc;
4949 			sc->sc_mixer_chan = 0;
4950 		}
4951 
4952 		if (repeat) {
4953 			goto tr_setup;
4954 		}
4955 		break;
4956 
4957 	default:			/* Error */
4958 		DPRINTF("error=%s\n", usbd_errstr(error));
4959 		if (error == USB_ERR_CANCELLED) {
4960 			/* do nothing - we are detaching */
4961 			break;
4962 		}
4963 		goto tr_transferred;
4964 	}
4965 }
4966 
4967 static usb_error_t
4968 uaudio_set_speed(struct usb_device *udev, uint8_t endpt, uint32_t speed)
4969 {
4970 	struct usb_device_request req;
4971 	uint8_t data[3];
4972 
4973 	DPRINTFN(6, "endpt=%d speed=%u\n", endpt, speed);
4974 
4975 	req.bmRequestType = UT_WRITE_CLASS_ENDPOINT;
4976 	req.bRequest = SET_CUR;
4977 	USETW2(req.wValue, SAMPLING_FREQ_CONTROL, 0);
4978 	USETW(req.wIndex, endpt);
4979 	USETW(req.wLength, 3);
4980 	data[0] = speed;
4981 	data[1] = speed >> 8;
4982 	data[2] = speed >> 16;
4983 
4984 	return (usbd_do_request(udev, NULL, &req, data));
4985 }
4986 
4987 static usb_error_t
4988 uaudio20_set_speed(struct usb_device *udev, uint8_t iface_no,
4989     uint8_t clockid, uint32_t speed)
4990 {
4991 	struct usb_device_request req;
4992 	uint8_t data[4];
4993 
4994 	DPRINTFN(6, "ifaceno=%d clockid=%d speed=%u\n",
4995 	    iface_no, clockid, speed);
4996 
4997 	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
4998 	req.bRequest = UA20_CS_CUR;
4999 	USETW2(req.wValue, UA20_CS_SAM_FREQ_CONTROL, 0);
5000 	USETW2(req.wIndex, clockid, iface_no);
5001 	USETW(req.wLength, 4);
5002 	data[0] = speed;
5003 	data[1] = speed >> 8;
5004 	data[2] = speed >> 16;
5005 	data[3] = speed >> 24;
5006 
5007 	return (usbd_do_request(udev, NULL, &req, data));
5008 }
5009 
5010 static int
5011 uaudio_mixer_signext(uint8_t type, int val)
5012 {
5013 	if (!MIX_UNSIGNED(type)) {
5014 		if (MIX_SIZE(type) == 2) {
5015 			val = (int16_t)val;
5016 		} else {
5017 			val = (int8_t)val;
5018 		}
5019 	}
5020 	return (val);
5021 }
5022 
5023 static int
5024 uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val)
5025 {
5026 	if (mc->type == MIX_ON_OFF) {
5027 		val = (val != 0);
5028 	} else if (mc->type == MIX_SELECTOR) {
5029 		if ((val < mc->minval) ||
5030 		    (val > mc->maxval)) {
5031 			val = mc->minval;
5032 		}
5033 	} else {
5034 
5035 		/* compute actual volume */
5036 		val = (val * mc->mul) / 255;
5037 
5038 		/* add lower offset */
5039 		val = val + mc->minval;
5040 
5041 		/* make sure we don't write a value out of range */
5042 		if (val > mc->maxval)
5043 			val = mc->maxval;
5044 		else if (val < mc->minval)
5045 			val = mc->minval;
5046 	}
5047 
5048 	DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n",
5049 	    mc->type, val, mc->minval, mc->maxval, val);
5050 	return (val);
5051 }
5052 
5053 static void
5054 uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
5055     uint8_t chan, int32_t val)
5056 {
5057 	val = uaudio_mixer_bsd2value(mc, val);
5058 
5059 	mc->update[chan / 8] |= (1 << (chan % 8));
5060 	mc->wData[chan] = val;
5061 
5062 	/* start the transfer, if not already started */
5063 
5064 	usbd_transfer_start(sc->sc_mixer_xfer[0]);
5065 }
5066 
5067 static void
5068 uaudio_mixer_init(struct uaudio_softc *sc)
5069 {
5070 	struct uaudio_mixer_node *mc;
5071 	int32_t i;
5072 
5073 	for (mc = sc->sc_mixer_root; mc;
5074 	    mc = mc->next) {
5075 
5076 		if (mc->ctl != SOUND_MIXER_NRDEVICES) {
5077 			/*
5078 			 * Set device mask bits. See
5079 			 * /usr/include/machine/soundcard.h
5080 			 */
5081 			sc->sc_mix_info |= (1 << mc->ctl);
5082 		}
5083 		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
5084 		    (mc->type == MIX_SELECTOR)) {
5085 
5086 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
5087 				if (mc->slctrtype[i - 1] == SOUND_MIXER_NRDEVICES) {
5088 					continue;
5089 				}
5090 				sc->sc_recsrc_info |= 1 << mc->slctrtype[i - 1];
5091 			}
5092 		}
5093 	}
5094 }
5095 
5096 int
5097 uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m)
5098 {
5099 	DPRINTF("\n");
5100 
5101 	sc->sc_mixer_lock = mixer_get_lock(m);
5102 	sc->sc_mixer_dev = m;
5103 
5104 	if (usbd_transfer_setup(sc->sc_udev, &sc->sc_mixer_iface_index,
5105 	    sc->sc_mixer_xfer, uaudio_mixer_config, 1, sc,
5106 	    sc->sc_mixer_lock)) {
5107 		DPRINTFN(0, "could not allocate USB "
5108 		    "transfer for audio mixer!\n");
5109 		return (ENOMEM);
5110 	}
5111 	if (!(sc->sc_mix_info & SOUND_MASK_VOLUME)) {
5112 		mix_setparentchild(m, SOUND_MIXER_VOLUME, SOUND_MASK_PCM);
5113 		mix_setrealdev(m, SOUND_MIXER_VOLUME, SOUND_MIXER_NONE);
5114 	}
5115 	mix_setdevs(m, sc->sc_mix_info);
5116 	mix_setrecdevs(m, sc->sc_recsrc_info);
5117 	return (0);
5118 }
5119 
5120 int
5121 uaudio_mixer_uninit_sub(struct uaudio_softc *sc)
5122 {
5123 	DPRINTF("\n");
5124 
5125 	usbd_transfer_unsetup(sc->sc_mixer_xfer, 1);
5126 
5127 	sc->sc_mixer_lock = NULL;
5128 
5129 	return (0);
5130 }
5131 
5132 void
5133 uaudio_mixer_set(struct uaudio_softc *sc, unsigned type,
5134     unsigned left, unsigned right)
5135 {
5136 	struct uaudio_mixer_node *mc;
5137 	int chan;
5138 
5139 	for (mc = sc->sc_mixer_root; mc != NULL; mc = mc->next) {
5140 
5141 		if (mc->ctl == type) {
5142 			for (chan = 0; chan < mc->nchan; chan++) {
5143 				uaudio_mixer_ctl_set(sc, mc, chan,
5144 				    (int)((chan == 0 ? left : right) *
5145 				    255) / 100);
5146 			}
5147 		}
5148 	}
5149 }
5150 
5151 uint32_t
5152 uaudio_mixer_setrecsrc(struct uaudio_softc *sc, uint32_t src)
5153 {
5154 	struct uaudio_mixer_node *mc;
5155 	uint32_t mask;
5156 	uint32_t temp;
5157 	int32_t i;
5158 
5159 	for (mc = sc->sc_mixer_root; mc;
5160 	    mc = mc->next) {
5161 
5162 		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
5163 		    (mc->type == MIX_SELECTOR)) {
5164 
5165 			/* compute selector mask */
5166 
5167 			mask = 0;
5168 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
5169 				mask |= (1 << mc->slctrtype[i - 1]);
5170 			}
5171 
5172 			temp = mask & src;
5173 			if (temp == 0) {
5174 				continue;
5175 			}
5176 			/* find the first set bit */
5177 			temp = (-temp) & temp;
5178 
5179 			/* update "src" */
5180 			src &= ~mask;
5181 			src |= temp;
5182 
5183 			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
5184 				if (temp != (1 << mc->slctrtype[i - 1])) {
5185 					continue;
5186 				}
5187 				uaudio_mixer_ctl_set(sc, mc, 0, i);
5188 				break;
5189 			}
5190 		}
5191 	}
5192 	return (src);
5193 }
5194 
5195 /*========================================================================*
5196  * MIDI support routines
5197  *========================================================================*/
5198 
5199 static void
5200 umidi_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
5201 {
5202 	struct umidi_chan *chan = usbd_xfer_softc(xfer);
5203 	struct umidi_sub_chan *sub;
5204 	struct usb_page_cache *pc;
5205 	uint8_t buf[4];
5206 	uint8_t cmd_len;
5207 	uint8_t cn;
5208 	uint16_t pos;
5209 	int actlen;
5210 
5211 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
5212 
5213 	switch (USB_GET_STATE(xfer)) {
5214 	case USB_ST_TRANSFERRED:
5215 
5216 		DPRINTF("actlen=%d bytes\n", actlen);
5217 
5218 		pos = 0;
5219 		pc = usbd_xfer_get_frame(xfer, 0);
5220 
5221 		while (actlen >= 4) {
5222 
5223 			/* copy out the MIDI data */
5224 			usbd_copy_out(pc, pos, buf, 4);
5225 			/* command length */
5226 			cmd_len = umidi_cmd_to_len[buf[0] & 0xF];
5227 			/* cable number */
5228 			cn = buf[0] >> 4;
5229 			/*
5230 			 * Lookup sub-channel. The index is range
5231 			 * checked below.
5232 			 */
5233 			sub = &chan->sub[cn];
5234 
5235 			if ((cmd_len != 0) &&
5236 			    (cn < chan->max_cable) &&
5237 			    (sub->read_open != 0)) {
5238 
5239 				/* Send data to the application */
5240 				usb_fifo_put_data_linear(
5241 				    sub->fifo.fp[USB_FIFO_RX],
5242 				    buf + 1, cmd_len, 1);
5243 			}
5244 			actlen -= 4;
5245 			pos += 4;
5246 		}
5247 
5248 	case USB_ST_SETUP:
5249 		DPRINTF("start\n");
5250 tr_setup:
5251 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
5252 		usbd_transfer_submit(xfer);
5253 		break;
5254 
5255 	default:
5256 		DPRINTF("error=%s\n", usbd_errstr(error));
5257 
5258 		if (error != USB_ERR_CANCELLED) {
5259 			/* try to clear stall first */
5260 			usbd_xfer_set_stall(xfer);
5261 			goto tr_setup;
5262 		}
5263 		break;
5264 	}
5265 }
5266 
5267 /*
5268  * The following statemachine, that converts MIDI commands to
5269  * USB MIDI packets, derives from Linux's usbmidi.c, which
5270  * was written by "Clemens Ladisch":
5271  *
5272  * Returns:
5273  *    0: No command
5274  * Else: Command is complete
5275  */
5276 static uint8_t
5277 umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b)
5278 {
5279 	uint8_t p0 = (cn << 4);
5280 
5281 	if (b >= 0xf8) {
5282 		sub->temp_0[0] = p0 | 0x0f;
5283 		sub->temp_0[1] = b;
5284 		sub->temp_0[2] = 0;
5285 		sub->temp_0[3] = 0;
5286 		sub->temp_cmd = sub->temp_0;
5287 		return (1);
5288 
5289 	} else if (b >= 0xf0) {
5290 		switch (b) {
5291 		case 0xf0:		/* system exclusive begin */
5292 			sub->temp_1[1] = b;
5293 			sub->state = UMIDI_ST_SYSEX_1;
5294 			break;
5295 		case 0xf1:		/* MIDI time code */
5296 		case 0xf3:		/* song select */
5297 			sub->temp_1[1] = b;
5298 			sub->state = UMIDI_ST_1PARAM;
5299 			break;
5300 		case 0xf2:		/* song position pointer */
5301 			sub->temp_1[1] = b;
5302 			sub->state = UMIDI_ST_2PARAM_1;
5303 			break;
5304 		case 0xf4:		/* unknown */
5305 		case 0xf5:		/* unknown */
5306 			sub->state = UMIDI_ST_UNKNOWN;
5307 			break;
5308 		case 0xf6:		/* tune request */
5309 			sub->temp_1[0] = p0 | 0x05;
5310 			sub->temp_1[1] = 0xf6;
5311 			sub->temp_1[2] = 0;
5312 			sub->temp_1[3] = 0;
5313 			sub->temp_cmd = sub->temp_1;
5314 			sub->state = UMIDI_ST_UNKNOWN;
5315 			return (1);
5316 
5317 		case 0xf7:		/* system exclusive end */
5318 			switch (sub->state) {
5319 			case UMIDI_ST_SYSEX_0:
5320 				sub->temp_1[0] = p0 | 0x05;
5321 				sub->temp_1[1] = 0xf7;
5322 				sub->temp_1[2] = 0;
5323 				sub->temp_1[3] = 0;
5324 				sub->temp_cmd = sub->temp_1;
5325 				sub->state = UMIDI_ST_UNKNOWN;
5326 				return (1);
5327 			case UMIDI_ST_SYSEX_1:
5328 				sub->temp_1[0] = p0 | 0x06;
5329 				sub->temp_1[2] = 0xf7;
5330 				sub->temp_1[3] = 0;
5331 				sub->temp_cmd = sub->temp_1;
5332 				sub->state = UMIDI_ST_UNKNOWN;
5333 				return (1);
5334 			case UMIDI_ST_SYSEX_2:
5335 				sub->temp_1[0] = p0 | 0x07;
5336 				sub->temp_1[3] = 0xf7;
5337 				sub->temp_cmd = sub->temp_1;
5338 				sub->state = UMIDI_ST_UNKNOWN;
5339 				return (1);
5340 			}
5341 			sub->state = UMIDI_ST_UNKNOWN;
5342 			break;
5343 		}
5344 	} else if (b >= 0x80) {
5345 		sub->temp_1[1] = b;
5346 		if ((b >= 0xc0) && (b <= 0xdf)) {
5347 			sub->state = UMIDI_ST_1PARAM;
5348 		} else {
5349 			sub->state = UMIDI_ST_2PARAM_1;
5350 		}
5351 	} else {			/* b < 0x80 */
5352 		switch (sub->state) {
5353 		case UMIDI_ST_1PARAM:
5354 			if (sub->temp_1[1] < 0xf0) {
5355 				p0 |= sub->temp_1[1] >> 4;
5356 			} else {
5357 				p0 |= 0x02;
5358 				sub->state = UMIDI_ST_UNKNOWN;
5359 			}
5360 			sub->temp_1[0] = p0;
5361 			sub->temp_1[2] = b;
5362 			sub->temp_1[3] = 0;
5363 			sub->temp_cmd = sub->temp_1;
5364 			return (1);
5365 		case UMIDI_ST_2PARAM_1:
5366 			sub->temp_1[2] = b;
5367 			sub->state = UMIDI_ST_2PARAM_2;
5368 			break;
5369 		case UMIDI_ST_2PARAM_2:
5370 			if (sub->temp_1[1] < 0xf0) {
5371 				p0 |= sub->temp_1[1] >> 4;
5372 				sub->state = UMIDI_ST_2PARAM_1;
5373 			} else {
5374 				p0 |= 0x03;
5375 				sub->state = UMIDI_ST_UNKNOWN;
5376 			}
5377 			sub->temp_1[0] = p0;
5378 			sub->temp_1[3] = b;
5379 			sub->temp_cmd = sub->temp_1;
5380 			return (1);
5381 		case UMIDI_ST_SYSEX_0:
5382 			sub->temp_1[1] = b;
5383 			sub->state = UMIDI_ST_SYSEX_1;
5384 			break;
5385 		case UMIDI_ST_SYSEX_1:
5386 			sub->temp_1[2] = b;
5387 			sub->state = UMIDI_ST_SYSEX_2;
5388 			break;
5389 		case UMIDI_ST_SYSEX_2:
5390 			sub->temp_1[0] = p0 | 0x04;
5391 			sub->temp_1[3] = b;
5392 			sub->temp_cmd = sub->temp_1;
5393 			sub->state = UMIDI_ST_SYSEX_0;
5394 			return (1);
5395 		default:
5396 			break;
5397 		}
5398 	}
5399 	return (0);
5400 }
5401 
5402 static void
5403 umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
5404 {
5405 	struct umidi_chan *chan = usbd_xfer_softc(xfer);
5406 	struct umidi_sub_chan *sub;
5407 	struct usb_page_cache *pc;
5408 	uint32_t actlen;
5409 	uint16_t nframes;
5410 	uint8_t buf;
5411 	uint8_t start_cable;
5412 	uint8_t tr_any;
5413 	int len;
5414 
5415 	usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
5416 
5417 	/*
5418 	 * NOTE: Some MIDI devices only accept 4 bytes of data per
5419 	 * short terminated USB transfer.
5420 	 */
5421 	switch (USB_GET_STATE(xfer)) {
5422 	case USB_ST_TRANSFERRED:
5423 		DPRINTF("actlen=%d bytes\n", len);
5424 
5425 	case USB_ST_SETUP:
5426 tr_setup:
5427 		DPRINTF("start\n");
5428 
5429 		nframes = 0;	/* reset */
5430 		start_cable = chan->curr_cable;
5431 		tr_any = 0;
5432 		pc = usbd_xfer_get_frame(xfer, 0);
5433 
5434 		while (1) {
5435 
5436 			/* round robin de-queueing */
5437 
5438 			sub = &chan->sub[chan->curr_cable];
5439 
5440 			if (sub->write_open) {
5441 				usb_fifo_get_data_linear(sub->fifo.fp[USB_FIFO_TX],
5442 				    &buf, 1, &actlen, 0);
5443 			} else {
5444 				actlen = 0;
5445 			}
5446 
5447 			if (actlen) {
5448 
5449 				tr_any = 1;
5450 
5451 				DPRINTF("byte=0x%02x from FIFO %u\n", buf,
5452 				    (unsigned int)chan->curr_cable);
5453 
5454 				if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) {
5455 
5456 					DPRINTF("sub=0x%02x 0x%02x 0x%02x 0x%02x\n",
5457 					    sub->temp_cmd[0], sub->temp_cmd[1],
5458 					    sub->temp_cmd[2], sub->temp_cmd[3]);
5459 
5460 					usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4);
5461 
5462 					nframes++;
5463 
5464 					if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0))
5465 						break;
5466 				} else {
5467 					continue;
5468 				}
5469 			}
5470 
5471 			chan->curr_cable++;
5472 			if (chan->curr_cable >= chan->max_cable)
5473 				chan->curr_cable = 0;
5474 
5475 			if (chan->curr_cable == start_cable) {
5476 				if (tr_any == 0)
5477 					break;
5478 				tr_any = 0;
5479 			}
5480 		}
5481 
5482 		if (nframes != 0) {
5483 			DPRINTF("Transferring %d frames\n", (int)nframes);
5484 			usbd_xfer_set_frame_len(xfer, 0, 4 * nframes);
5485 			usbd_transfer_submit(xfer);
5486 		}
5487 		break;
5488 
5489 	default:			/* Error */
5490 
5491 		DPRINTF("error=%s\n", usbd_errstr(error));
5492 
5493 		if (error != USB_ERR_CANCELLED) {
5494 			/* try to clear stall first */
5495 			usbd_xfer_set_stall(xfer);
5496 			goto tr_setup;
5497 		}
5498 		break;
5499 	}
5500 }
5501 
5502 static struct umidi_sub_chan *
5503 umidi_sub_by_fifo(struct usb_fifo *fifo)
5504 {
5505 	struct umidi_chan *chan = usb_fifo_softc(fifo);
5506 	struct umidi_sub_chan *sub;
5507 	uint32_t n;
5508 
5509 	for (n = 0; n < UMIDI_CABLES_MAX; n++) {
5510 		sub = &chan->sub[n];
5511 		if ((sub->fifo.fp[USB_FIFO_RX] == fifo) ||
5512 		    (sub->fifo.fp[USB_FIFO_TX] == fifo)) {
5513 			return (sub);
5514 		}
5515 	}
5516 
5517 	panic("%s:%d cannot find usb_fifo!\n",
5518 	    __FILE__, __LINE__);
5519 
5520 	return (NULL);
5521 }
5522 
5523 static void
5524 umidi_start_read(struct usb_fifo *fifo)
5525 {
5526 	struct umidi_chan *chan = usb_fifo_softc(fifo);
5527 
5528 	usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]);
5529 }
5530 
5531 static void
5532 umidi_stop_read(struct usb_fifo *fifo)
5533 {
5534 	struct umidi_chan *chan = usb_fifo_softc(fifo);
5535 	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
5536 
5537 	DPRINTF("\n");
5538 
5539 	sub->read_open = 0;
5540 
5541 	if (--(chan->read_open_refcount) == 0) {
5542 		/*
5543 		 * XXX don't stop the read transfer here, hence that causes
5544 		 * problems with some MIDI adapters
5545 		 */
5546 		DPRINTF("(stopping read transfer)\n");
5547 	}
5548 }
5549 
5550 static void
5551 umidi_start_write(struct usb_fifo *fifo)
5552 {
5553 	struct umidi_chan *chan = usb_fifo_softc(fifo);
5554 
5555 	usbd_transfer_start(chan->xfer[UMIDI_TX_TRANSFER]);
5556 }
5557 
5558 static void
5559 umidi_stop_write(struct usb_fifo *fifo)
5560 {
5561 	struct umidi_chan *chan = usb_fifo_softc(fifo);
5562 	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
5563 
5564 	DPRINTF("\n");
5565 
5566 	sub->write_open = 0;
5567 
5568 	if (--(chan->write_open_refcount) == 0) {
5569 		DPRINTF("(stopping write transfer)\n");
5570 		usbd_transfer_stop(chan->xfer[UMIDI_TX_TRANSFER]);
5571 	}
5572 }
5573 
5574 static int
5575 umidi_open(struct usb_fifo *fifo, int fflags)
5576 {
5577 	struct umidi_chan *chan = usb_fifo_softc(fifo);
5578 	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
5579 
5580 	if (fflags & FREAD) {
5581 		if (usb_fifo_alloc_buffer(fifo, 4, (1024 / 4))) {
5582 			return (ENOMEM);
5583 		}
5584 		mtx_lock(&chan->mtx);
5585 		chan->read_open_refcount++;
5586 		sub->read_open = 1;
5587 		mtx_unlock(&chan->mtx);
5588 	}
5589 	if (fflags & FWRITE) {
5590 		if (usb_fifo_alloc_buffer(fifo, 32, (1024 / 32))) {
5591 			return (ENOMEM);
5592 		}
5593 		/* clear stall first */
5594 		mtx_lock(&chan->mtx);
5595 		chan->write_open_refcount++;
5596 		sub->write_open = 1;
5597 
5598 		/* reset */
5599 		sub->state = UMIDI_ST_UNKNOWN;
5600 		mtx_unlock(&chan->mtx);
5601 	}
5602 	return (0);			/* success */
5603 }
5604 
5605 static void
5606 umidi_close(struct usb_fifo *fifo, int fflags)
5607 {
5608 	if (fflags & FREAD) {
5609 		usb_fifo_free_buffer(fifo);
5610 	}
5611 	if (fflags & FWRITE) {
5612 		usb_fifo_free_buffer(fifo);
5613 	}
5614 }
5615 
5616 
5617 static int
5618 umidi_ioctl(struct usb_fifo *fifo, u_long cmd, void *data,
5619     int fflags)
5620 {
5621 	return (ENODEV);
5622 }
5623 
5624 static void
5625 umidi_init(device_t dev)
5626 {
5627 	struct uaudio_softc *sc = device_get_softc(dev);
5628 	struct umidi_chan *chan = &sc->sc_midi_chan;
5629 
5630 	mtx_init(&chan->mtx, "umidi lock", NULL, MTX_DEF | MTX_RECURSE);
5631 }
5632 
5633 static struct usb_fifo_methods umidi_fifo_methods = {
5634 	.f_start_read = &umidi_start_read,
5635 	.f_start_write = &umidi_start_write,
5636 	.f_stop_read = &umidi_stop_read,
5637 	.f_stop_write = &umidi_stop_write,
5638 	.f_open = &umidi_open,
5639 	.f_close = &umidi_close,
5640 	.f_ioctl = &umidi_ioctl,
5641 	.basename[0] = "umidi",
5642 };
5643 
5644 static int
5645 umidi_probe(device_t dev)
5646 {
5647 	struct uaudio_softc *sc = device_get_softc(dev);
5648 	struct usb_attach_arg *uaa = device_get_ivars(dev);
5649 	struct umidi_chan *chan = &sc->sc_midi_chan;
5650 	struct umidi_sub_chan *sub;
5651 	int unit = device_get_unit(dev);
5652 	int error;
5653 	uint32_t n;
5654 
5655 	if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI))
5656 		chan->single_command = 1;
5657 
5658 	if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index,
5659 	    chan->iface_alt_index)) {
5660 		DPRINTF("setting of alternate index failed!\n");
5661 		goto detach;
5662 	}
5663 	usbd_set_parent_iface(sc->sc_udev, chan->iface_index,
5664 	    sc->sc_mixer_iface_index);
5665 
5666 	error = usbd_transfer_setup(uaa->device, &chan->iface_index,
5667 	    chan->xfer, umidi_config, UMIDI_N_TRANSFER,
5668 	    chan, &chan->mtx);
5669 	if (error) {
5670 		DPRINTF("error=%s\n", usbd_errstr(error));
5671 		goto detach;
5672 	}
5673 	if ((chan->max_cable > UMIDI_CABLES_MAX) ||
5674 	    (chan->max_cable == 0)) {
5675 		chan->max_cable = UMIDI_CABLES_MAX;
5676 	}
5677 
5678 	for (n = 0; n < chan->max_cable; n++) {
5679 
5680 		sub = &chan->sub[n];
5681 
5682 		error = usb_fifo_attach(sc->sc_udev, chan, &chan->mtx,
5683 		    &umidi_fifo_methods, &sub->fifo, unit, n,
5684 		    chan->iface_index,
5685 		    UID_ROOT, GID_OPERATOR, 0644);
5686 		if (error) {
5687 			goto detach;
5688 		}
5689 	}
5690 
5691 	mtx_lock(&chan->mtx);
5692 
5693 	/*
5694 	 * NOTE: At least one device will not work properly unless the
5695 	 * BULK IN pipe is open all the time. This might have to do
5696 	 * about that the internal queues of the device overflow if we
5697 	 * don't read them regularly.
5698 	 */
5699 	usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]);
5700 
5701 	mtx_unlock(&chan->mtx);
5702 
5703 	return (0);			/* success */
5704 
5705 detach:
5706 	return (ENXIO);			/* failure */
5707 }
5708 
5709 static int
5710 umidi_detach(device_t dev)
5711 {
5712 	struct uaudio_softc *sc = device_get_softc(dev);
5713 	struct umidi_chan *chan = &sc->sc_midi_chan;
5714 	uint32_t n;
5715 
5716 	for (n = 0; n < UMIDI_CABLES_MAX; n++) {
5717 		usb_fifo_detach(&chan->sub[n].fifo);
5718 	}
5719 
5720 	mtx_lock(&chan->mtx);
5721 
5722 	usbd_transfer_stop(chan->xfer[UMIDI_RX_TRANSFER]);
5723 
5724 	mtx_unlock(&chan->mtx);
5725 
5726 	usbd_transfer_unsetup(chan->xfer, UMIDI_N_TRANSFER);
5727 
5728 	mtx_destroy(&chan->mtx);
5729 
5730 	return (0);
5731 }
5732 
5733 static void
5734 uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error)
5735 {
5736 	struct uaudio_softc *sc = usbd_xfer_softc(xfer);
5737 	const uint8_t *buffer = usbd_xfer_get_frame_buffer(xfer, 0);
5738 	struct snd_mixer *m;
5739 	uint8_t id;
5740 	int actlen;
5741 
5742 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
5743 
5744 	switch (USB_GET_STATE(xfer)) {
5745 	case USB_ST_TRANSFERRED:
5746 		DPRINTF("actlen=%d\n", actlen);
5747 
5748 		if (actlen != 0 &&
5749 		    (sc->sc_hid.flags & UAUDIO_HID_HAS_ID)) {
5750 			id = *buffer;
5751 			buffer++;
5752 			actlen--;
5753 		} else {
5754 			id = 0;
5755 		}
5756 
5757 		m = sc->sc_mixer_dev;
5758 
5759 		if ((sc->sc_hid.flags & UAUDIO_HID_HAS_MUTE) &&
5760 		    (sc->sc_hid.mute_id == id) &&
5761 		    hid_get_data(buffer, actlen,
5762 		    &sc->sc_hid.mute_loc)) {
5763 
5764 			DPRINTF("Mute toggle\n");
5765 
5766 			mixer_hwvol_mute_locked(m);
5767 		}
5768 
5769 		if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_UP) &&
5770 		    (sc->sc_hid.volume_up_id == id) &&
5771 		    hid_get_data(buffer, actlen,
5772 		    &sc->sc_hid.volume_up_loc)) {
5773 
5774 			DPRINTF("Volume Up\n");
5775 
5776 			mixer_hwvol_step_locked(m, 1, 1);
5777 		}
5778 
5779 		if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_DOWN) &&
5780 		    (sc->sc_hid.volume_down_id == id) &&
5781 		    hid_get_data(buffer, actlen,
5782 		    &sc->sc_hid.volume_down_loc)) {
5783 
5784 			DPRINTF("Volume Down\n");
5785 
5786 			mixer_hwvol_step_locked(m, -1, -1);
5787 		}
5788 
5789 	case USB_ST_SETUP:
5790 tr_setup:
5791 		/* check if we can put more data into the FIFO */
5792 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
5793 		usbd_transfer_submit(xfer);
5794 		break;
5795 
5796 	default:			/* Error */
5797 
5798 		DPRINTF("error=%s\n", usbd_errstr(error));
5799 
5800 		if (error != USB_ERR_CANCELLED) {
5801 			/* try to clear stall first */
5802 			usbd_xfer_set_stall(xfer);
5803 			goto tr_setup;
5804 		}
5805 		break;
5806 	}
5807 }
5808 
5809 static int
5810 uaudio_hid_probe(struct uaudio_softc *sc,
5811     struct usb_attach_arg *uaa)
5812 {
5813 	void *d_ptr;
5814 	uint32_t flags;
5815 	uint16_t d_len;
5816 	uint8_t id;
5817 	int error;
5818 
5819 	if (!(sc->sc_hid.flags & UAUDIO_HID_VALID))
5820 		return (-1);
5821 
5822 	if (sc->sc_mixer_lock == NULL)
5823 		return (-1);
5824 
5825 	/* Get HID descriptor */
5826 	error = usbd_req_get_hid_desc(uaa->device, NULL, &d_ptr,
5827 	    &d_len, M_TEMP, sc->sc_hid.iface_index);
5828 
5829 	if (error) {
5830 		DPRINTF("error reading report description\n");
5831 		return (-1);
5832 	}
5833 
5834 	/* check if there is an ID byte */
5835 	hid_report_size(d_ptr, d_len, hid_input, &id);
5836 
5837 	if (id != 0)
5838 		sc->sc_hid.flags |= UAUDIO_HID_HAS_ID;
5839 
5840 	if (hid_locate(d_ptr, d_len,
5841 	    HID_USAGE2(HUP_CONSUMER, 0xE9 /* Volume Increment */),
5842 	    hid_input, 0, &sc->sc_hid.volume_up_loc, &flags,
5843 	    &sc->sc_hid.volume_up_id)) {
5844 		if (flags & HIO_VARIABLE)
5845 			sc->sc_hid.flags |= UAUDIO_HID_HAS_VOLUME_UP;
5846 		DPRINTFN(1, "Found Volume Up key\n");
5847 	}
5848 
5849 	if (hid_locate(d_ptr, d_len,
5850 	    HID_USAGE2(HUP_CONSUMER, 0xEA /* Volume Decrement */),
5851 	    hid_input, 0, &sc->sc_hid.volume_down_loc, &flags,
5852 	    &sc->sc_hid.volume_down_id)) {
5853 		if (flags & HIO_VARIABLE)
5854 			sc->sc_hid.flags |= UAUDIO_HID_HAS_VOLUME_DOWN;
5855 		DPRINTFN(1, "Found Volume Down key\n");
5856 	}
5857 
5858 	if (hid_locate(d_ptr, d_len,
5859 	    HID_USAGE2(HUP_CONSUMER, 0xE2 /* Mute */),
5860 	    hid_input, 0, &sc->sc_hid.mute_loc, &flags,
5861 	    &sc->sc_hid.mute_id)) {
5862 		if (flags & HIO_VARIABLE)
5863 			sc->sc_hid.flags |= UAUDIO_HID_HAS_MUTE;
5864 		DPRINTFN(1, "Found Mute key\n");
5865 	}
5866 
5867 	free(d_ptr, M_TEMP);
5868 
5869 	if (!(sc->sc_hid.flags & (UAUDIO_HID_HAS_VOLUME_UP |
5870 	    UAUDIO_HID_HAS_VOLUME_DOWN |
5871 	    UAUDIO_HID_HAS_MUTE))) {
5872 		DPRINTFN(1, "Did not find any volume related keys\n");
5873 		return (-1);
5874 	}
5875 
5876 	/* prevent the uhid driver from attaching */
5877 	usbd_set_parent_iface(uaa->device, sc->sc_hid.iface_index,
5878 	    sc->sc_mixer_iface_index);
5879 
5880 	/* allocate USB transfers */
5881 	error = usbd_transfer_setup(uaa->device, &sc->sc_hid.iface_index,
5882 	    sc->sc_hid.xfer, uaudio_hid_config, UAUDIO_HID_N_TRANSFER,
5883 	    sc, sc->sc_mixer_lock);
5884 	if (error) {
5885 		DPRINTF("error=%s\n", usbd_errstr(error));
5886 		return (-1);
5887 	}
5888 	return (0);
5889 }
5890 
5891 static void
5892 uaudio_hid_detach(struct uaudio_softc *sc)
5893 {
5894 	usbd_transfer_unsetup(sc->sc_hid.xfer, UAUDIO_HID_N_TRANSFER);
5895 }
5896 
5897 DRIVER_MODULE(uaudio, uhub, uaudio_driver, uaudio_devclass, NULL, 0);
5898 MODULE_DEPEND(uaudio, usb, 1, 1, 1);
5899 MODULE_DEPEND(uaudio, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
5900 MODULE_VERSION(uaudio, 1);
5901