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