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