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