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