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