Date: Tue, 1 Jul 2008 21:44:54 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144445 for review Message-ID: <200807012144.m61LisVj091287@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144445 Change 144445 by hselasky@hselasky_laptop001 on 2008/07/01 21:44:42 New USB sound module is finished and tested. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#8 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.h#3 edit .. //depot/projects/usb/src/sys/dev/usb2/include/usb2_defs.h#3 edit .. //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2_reg.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/sound/usb2_sound.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/sound/usb2_sound.h#1 add .. //depot/projects/usb/src/sys/modules/usb2/sound/Makefile#2 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#8 (text+ko) ==== @@ -391,7 +391,7 @@ struct usb2_interface_descriptor *usb2_get_interface_descriptor(struct usb2_interface *iface); uint8_t usb2_clear_stall_callback(struct usb2_xfer *xfer1, struct usb2_xfer *xfer2); uint8_t usb2_get_interface_altindex(struct usb2_interface *iface); -uint8_t usb2_get_quirk(struct usb2_attach_arg *uaa, uint16_t quirk); +usb2_error_t usb2_set_alt_interface_index(struct usb2_device *udev, uint8_t iface_index, uint8_t alt_index); uint8_t usb2_get_speed(struct usb2_device *udev); usb2_error_t usb2_transfer_setup(struct usb2_device *udev, const uint8_t *ifaces, struct usb2_xfer **pxfer, const struct usb2_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *priv_mtx); void usb2_set_frame_data(struct usb2_xfer *xfer, void *ptr, uint32_t frindex); ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.h#3 (text+ko) ==== @@ -147,7 +147,6 @@ usb2_error_t usb2_interface_count(struct usb2_device *udev, uint8_t *count); usb2_error_t usb2_probe_and_attach(struct usb2_device *udev, uint8_t iface_index); usb2_error_t usb2_reset_iface_endpoints(struct usb2_device *udev, uint8_t iface_index); -usb2_error_t usb2_set_alt_interface_index(struct usb2_device *udev, uint8_t iface_index, uint8_t alt_index); usb2_error_t usb2_set_config_index(struct usb2_device *udev, uint8_t index); usb2_error_t usb2_set_endpoint_stall(struct usb2_device *udev, struct usb2_pipe *pipe, uint8_t do_stall); usb2_error_t usb2_suspend_resume(struct usb2_device *udev, uint8_t do_suspend); ==== //depot/projects/usb/src/sys/dev/usb2/include/usb2_defs.h#3 (text+ko) ==== @@ -32,7 +32,7 @@ #define USB_DEV_MAX 128 /* units */ #define USB_IFACE_MAX 32 /* units */ #define USB_EP_MAX (2*16) /* hardcoded */ -#define USB_FIFO_MAX (2 * USB_EP_MAX) +#define USB_FIFO_MAX (4 * USB_EP_MAX) #define USB_MAX_DEVICES USB_DEV_MAX /* including virtual root HUB and * address zero */ ==== //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2.c#2 (text+ko) ==== @@ -52,18 +52,30 @@ * $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $ */ -#include <sys/cdefs.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/malloc.h> +#include <dev/usb2/include/usb2_devid.h> +#include <dev/usb2/include/usb2_standard.h> +#include <dev/usb2/include/usb2_mfunc.h> +#include <dev/usb2/include/usb2_error.h> +#include <dev/usb2/include/usb2_revision.h> + +#define USB_DEBUG_VAR uaudio_debug + +#include <dev/usb2/core/usb2_core.h> +#include <dev/usb2/core/usb2_lookup.h> +#include <dev/usb2/core/usb2_debug.h> +#include <dev/usb2/core/usb2_util.h> +#include <dev/usb2/core/usb2_busdma.h> +#include <dev/usb2/core/usb2_parse.h> +#include <dev/usb2/core/usb2_request.h> +#include <dev/usb2/core/usb2_mbuf.h> +#include <dev/usb2/core/usb2_dev.h> +#include <dev/usb2/core/usb2_dynamic.h> + +#include <dev/usb2/quirk/usb2_quirk.h> +#include <dev/usb2/sound/uaudio2_reg.h> + #include <sys/reboot.h> /* for bootverbose */ -#include <dev/usb/usb_port.h> -#include <dev/usb/usb.h> -#include <dev/usb/usb_subr.h> -#include <dev/usb/usb_quirks.h> - #include <dev/sound/pcm/sound.h> #include <dev/sound/chip.h> #include "feeder_if.h" @@ -72,17 +84,11 @@ #include <dev/sound/usb/uaudio.h> #ifdef USB_DEBUG -#define DPRINTF(n,fmt,...) \ - do { if (uaudio_debug > (n)) { \ - printf("%s: " fmt, __FUNCTION__,## __VA_ARGS__); } } while (0) - static int uaudio_debug = 0; -SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio"); -SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW, +SYSCTL_NODE(_hw_usb2, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio"); +SYSCTL_INT(_hw_usb2_uaudio, OID_AUTO, debug, CTLFLAG_RW, &uaudio_debug, 0, "uaudio debug level"); -#else -#define DPRINTF(...) do { } while (0) #endif static uint32_t uaudio_default_rate = 96000; @@ -94,8 +100,6 @@ #define UAUDIO_RECURSE_LIMIT 24 /* rounds */ #define UAUDIO_DEFAULT_BUFSZ (16*1024) /* bytes */ - - #define MAKE_WORD(h,l) (((h) << 8) | (l)) #define BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1) @@ -135,16 +139,16 @@ struct pcmchan_caps pcm_cap; /* capabilities */ struct snd_dbuf *pcm_buf; - const struct usbd_config *usb_cfg; + const struct usb2_config *usb2_cfg; struct mtx *pcm_mtx; /* lock protecting this structure */ struct uaudio_softc *priv_sc; struct pcm_channel *pcm_ch; - struct usbd_xfer *xfer[UAUDIO_NCHANBUFS]; - const struct usb_audio_streaming_interface_descriptor *p_asid; - const struct usb_audio_streaming_type1_descriptor *p_asf1d; - const struct usb_audio_streaming_endpoint_descriptor *p_sed; - const usb_endpoint_descriptor_audio_t *p_ed1; - const usb_endpoint_descriptor_audio_t *p_ed2; + struct usb2_xfer *xfer[UAUDIO_NCHANBUFS]; + const struct usb2_audio_streaming_interface_descriptor *p_asid; + const struct usb2_audio_streaming_type1_descriptor *p_asf1d; + const struct usb2_audio_streaming_endpoint_descriptor *p_sed; + const usb2_endpoint_descriptor_audio_t *p_ed1; + const usb2_endpoint_descriptor_audio_t *p_ed2; const struct uaudio_format *p_fmt; uint8_t *buf; /* pointer to buffer */ @@ -170,7 +174,7 @@ #define UMIDI_BULK_SIZE 1024 /* bytes */ struct umidi_sub_chan { - struct usb_cdev cdev; + struct usb2_fifo_sc fifo; uint8_t *temp_cmd; uint8_t temp_0[4]; uint8_t temp_1[4]; @@ -193,7 +197,7 @@ struct umidi_sub_chan sub[UMIDI_CABLES_MAX]; struct mtx mtx; - struct usbd_xfer *xfer[UMIDI_N_TRANSFER]; + struct usb2_xfer *xfer[UMIDI_N_TRANSFER]; uint8_t iface_index; uint8_t iface_alt_index; @@ -217,8 +221,8 @@ struct uaudio_chan sc_play_chan; struct umidi_chan sc_midi_chan; - struct usbd_device *sc_udev; - struct usbd_xfer *sc_mixer_xfer[1]; + struct usb2_device *sc_udev; + struct usb2_xfer *sc_mixer_xfer[1]; struct mtx *sc_mixer_lock; struct uaudio_mixer_node *sc_mixer_root; struct uaudio_mixer_node *sc_mixer_curr; @@ -226,7 +230,6 @@ uint32_t sc_buffer_size; uint32_t sc_mix_info; uint32_t sc_recsrc_info; - uint32_t sc_quirks; uint16_t sc_audio_rev; uint16_t sc_mixer_count; @@ -237,7 +240,10 @@ uint8_t sc_mixer_chan; uint8_t sc_pcm_registered:1; uint8_t sc_mixer_init:1; - uint8_t sc_unused:6; + uint8_t sc_uq_audio_swap_lr:1; + uint8_t sc_uq_au_inp_async:1; + uint8_t sc_uq_au_no_xu:1; + uint8_t sc_uq_bad_adc:1; }; struct uaudio_search_result { @@ -250,14 +256,14 @@ struct uaudio_terminal_node { union { - const usb_descriptor_t *desc; - const struct usb_audio_input_terminal *it; - const struct usb_audio_output_terminal *ot; - const struct usb_audio_mixer_unit_0 *mu; - const struct usb_audio_selector_unit *su; - const struct usb_audio_feature_unit *fu; - const struct usb_audio_processing_unit_0 *pu; - const struct usb_audio_extension_unit_0 *eu; + const struct usb2_descriptor *desc; + const struct usb2_audio_input_terminal *it; + const struct usb2_audio_output_terminal *ot; + const struct usb2_audio_mixer_unit_0 *mu; + const struct usb2_audio_selector_unit *su; + const struct usb2_audio_feature_unit *fu; + const struct usb2_audio_processing_unit_0 *pu; + const struct usb2_audio_extension_unit_0 *eu; } u; struct uaudio_search_result usr; struct uaudio_terminal_node *root; @@ -307,157 +313,74 @@ static device_attach_t uaudio_attach; static device_detach_t uaudio_detach; -static usbd_callback_t uaudio_chan_play_callback; -static usbd_callback_t uaudio_chan_record_callback; -static usbd_callback_t uaudio_mixer_write_cfg_callback; -static usbd_callback_t umidi_read_clear_stall_callback; -static usbd_callback_t umidi_bulk_read_callback; -static usbd_callback_t umidi_write_clear_stall_callback; -static usbd_callback_t umidi_bulk_write_callback; +static usb2_callback_t uaudio_chan_play_callback; +static usb2_callback_t uaudio_chan_record_callback; +static usb2_callback_t uaudio_mixer_write_cfg_callback; +static usb2_callback_t umidi_read_clear_stall_callback; +static usb2_callback_t umidi_bulk_read_callback; +static usb2_callback_t umidi_write_clear_stall_callback; +static usb2_callback_t umidi_bulk_write_callback; #ifdef USB_DEBUG -static void - uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed); +static void uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed); #endif -static void -uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usbd_device *udev, - uint32_t rate, uint16_t fps, uint8_t channels, - uint8_t bit_resolution); - -static void - uaudio_chan_fill_info(struct uaudio_softc *sc, struct usbd_device *udev); - -static void -uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, - struct uaudio_mixer_node *mc); -static void - uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc); +static void uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb2_device *udev, uint32_t rate, uint16_t fps, uint8_t channels, uint8_t bit_resolution); +static void uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb2_device *udev); +static void uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc); +static void uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc); +static void uaudio_mixer_add_input(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static void uaudio_mixer_add_output(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static void uaudio_mixer_add_mixer(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static void uaudio_mixer_add_selector(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static uint32_t uaudio_mixer_feature_get_bmaControls(const struct usb2_audio_feature_unit *d, uint8_t index); +static void uaudio_mixer_add_feature(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static void uaudio_mixer_add_processing_updown(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static void uaudio_mixer_add_processing(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static void uaudio_mixer_add_extension(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id); +static const void *uaudio_mixer_verify_desc(const void *arg, uint32_t len); -static void -uaudio_mixer_add_input(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static void -uaudio_mixer_add_output(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static void -uaudio_mixer_add_mixer(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static void -uaudio_mixer_add_selector(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static uint32_t -uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d, - uint8_t index); -static void -uaudio_mixer_add_feature(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static void -uaudio_mixer_add_processing_updown(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, - int id); -static void -uaudio_mixer_add_processing(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static void -uaudio_mixer_add_extension(struct uaudio_softc *sc, - const struct uaudio_terminal_node *iot, int id); -static const void * - uaudio_mixer_verify_desc(const void *arg, uint32_t len); - #ifdef USB_DEBUG -static void - uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot); +static void uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot); #endif -static struct usb_audio_cluster - uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot); +static struct usb2_audio_cluster uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot); #ifdef USB_DEBUG -static const char * - uaudio_mixer_get_terminal_name(uint16_t terminal_type); +static const char *uaudio_mixer_get_terminal_name(uint16_t terminal_type); #endif -static uint16_t -uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot, - struct uaudio_mixer_node *mix); -static uint16_t -uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot, - struct uaudio_mixer_node *mix); +static uint16_t uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot, struct uaudio_mixer_node *mix); +static uint16_t uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot, struct uaudio_mixer_node *mix); +static const struct uaudio_terminal_node *uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t index); +static const struct uaudio_terminal_node *uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, uint8_t index); +static void uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root, const uint8_t *p_id, uint8_t n_id, struct uaudio_search_result *info); +static void uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id, uint8_t n_id, struct uaudio_search_result *info); +static void uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usb2_device *udev, void *desc); +static uint16_t uaudio_mixer_get(struct usb2_device *udev, uint8_t what, struct uaudio_mixer_node *mc); +static usb2_error_t uaudio_set_speed(struct usb2_device *udev, uint8_t endpt, uint32_t speed); +static int uaudio_mixer_signext(uint8_t type, int val); +static int uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val); -static const struct uaudio_terminal_node * - uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t index); +static void uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc, uint8_t chan, int32_t val); +static void uaudio_mixer_init(struct uaudio_softc *sc); +static uint8_t umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b); +static struct umidi_sub_chan *umidi_sub_by_fifo(struct usb2_fifo *fifo); +static void umidi_start_read(struct usb2_fifo *fifo); +static void umidi_stop_read(struct usb2_fifo *fifo); +static void umidi_start_write(struct usb2_fifo *fifo); +static void umidi_stop_write(struct usb2_fifo *fifo); +static int umidi_open(struct usb2_fifo *fifo, int fflags, struct thread *td); +static int umidi_ioctl(struct usb2_fifo *fifo, u_long cmd, void *data, int fflags, struct thread *td); +static void umidi_close(struct usb2_fifo *fifo, int fflags, struct thread *td); +static void umidi_init(device_t dev); +static int32_t umidi_probe(device_t dev); +static int32_t umidi_detach(device_t dev); -static const struct uaudio_terminal_node * -uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, - uint8_t index); -static void -uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root, - const uint8_t *p_id, uint8_t n_id, - struct uaudio_search_result *info); -static void -uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id, - uint8_t n_id, - struct uaudio_search_result *info); -static void -uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usbd_device *udev, - void *desc); -static uint16_t -uaudio_mixer_get(struct usbd_device *udev, uint8_t what, - struct uaudio_mixer_node *mc); -static usbd_status_t - uaudio_set_speed(struct usbd_device *udev, uint8_t endpt, uint32_t speed); - -static int - uaudio_mixer_signext(uint8_t type, int val); - -static int - uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val); - -static void -uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc, - uint8_t chan, int32_t val); -static void - uaudio_mixer_init(struct uaudio_softc *sc); - -static uint8_t - umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b); - -static struct umidi_sub_chan * - umidi_sub_by_cdev(struct usb_cdev *cdev); - -static void - umidi_start_read(struct usb_cdev *cdev); - -static void - umidi_stop_read(struct usb_cdev *cdev); - -static void - umidi_start_write(struct usb_cdev *cdev); - -static void - umidi_stop_write(struct usb_cdev *cdev); - -static int32_t -umidi_open(struct usb_cdev *cdev, int32_t fflags, - int32_t devtype, struct thread *td); - -static int32_t -umidi_ioctl(struct usb_cdev *cdev, u_long cmd, caddr_t data, - int32_t fflags, struct thread *td); -static void - umidi_init(device_t dev); - -static int32_t - umidi_probe(device_t dev); - -static int32_t - umidi_detach(device_t dev); - -static const struct usbd_config +static const struct usb2_config uaudio_cfg_record_full_speed[UAUDIO_NCHANBUFS] = { [0] = { .type = UE_ISOCHRONOUS, @@ -480,7 +403,7 @@ }, }; -static const struct usbd_config +static const struct usb2_config uaudio_cfg_record_high_speed[UAUDIO_NCHANBUFS] = { [0] = { .type = UE_ISOCHRONOUS, @@ -503,7 +426,7 @@ }, }; -static const struct usbd_config +static const struct usb2_config uaudio_cfg_play_full_speed[UAUDIO_NCHANBUFS] = { [0] = { .type = UE_ISOCHRONOUS, @@ -526,7 +449,7 @@ }, }; -static const struct usbd_config +static const struct usb2_config uaudio_cfg_play_high_speed[UAUDIO_NCHANBUFS] = { [0] = { .type = UE_ISOCHRONOUS, @@ -549,13 +472,13 @@ }, }; -static const struct usbd_config +static const struct usb2_config uaudio_mixer_config[1] = { [0] = { .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = (sizeof(usb_device_request_t) + 4), + .mh.bufsize = (sizeof(struct usb2_device_request) + 4), .mh.callback = &uaudio_mixer_write_cfg_callback, .mh.timeout = 1000, /* 1 second */ }, @@ -581,7 +504,7 @@ [0xF] = 1, /* bytes */ }; -static const struct usbd_config +static const struct usb2_config umidi_config[UMIDI_N_TRANSFER] = { [0] = { .type = UE_BULK, @@ -605,7 +528,7 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.flags = {}, .mh.callback = &umidi_write_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ @@ -616,7 +539,7 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.flags = {}, .mh.callback = &umidi_read_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ @@ -646,34 +569,29 @@ static int uaudio_probe(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); - usb_interface_descriptor_t *id; + struct usb2_attach_arg *uaa = device_get_ivars(dev); - if (uaa->usb_mode != USB_MODE_HOST) { - return (UMATCH_NONE); - } - if (uaa->iface == NULL) { - return (UMATCH_NONE); + if (uaa->usb2_mode != USB_MODE_HOST) { + return (ENXIO); } - id = usbd_get_interface_descriptor(uaa->iface); - /* trigger on the control interface */ - if ((id == NULL) || - (id->bInterfaceClass != UICLASS_AUDIO) || - (id->bInterfaceSubClass != UISUBCLASS_AUDIOCONTROL) || - (usbd_get_quirks(uaa->device)->uq_flags & UQ_BAD_AUDIO)) { - return (UMATCH_NONE); + if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) && + (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL)) { + if (usb2_test_quirk(uaa, UQ_BAD_AUDIO)) + return (ENXIO); + else + return (0); } - return (UMATCH_IFACECLASS_IFACESUBCLASS); + return (ENXIO); } static int uaudio_attach(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); + struct usb2_attach_arg *uaa = device_get_ivars(dev); struct uaudio_softc *sc = device_get_softc(dev); - usb_interface_descriptor_t *id; + struct usb2_interface_descriptor *id; device_t child; if (sc == NULL) { @@ -682,20 +600,31 @@ sc->sc_play_chan.priv_sc = sc; sc->sc_rec_chan.priv_sc = sc; sc->sc_udev = uaa->device; - sc->sc_quirks = usbd_get_quirks(uaa->device)->uq_flags; + + if (usb2_test_quirk(uaa, UQ_AUDIO_SWAP_LR)) + sc->sc_uq_audio_swap_lr = 1; + + if (usb2_test_quirk(uaa, UQ_AU_INP_ASYNC)) + sc->sc_uq_au_inp_async = 1; + + if (usb2_test_quirk(uaa, UQ_AU_NO_XU)) + sc->sc_uq_au_no_xu = 1; + + if (usb2_test_quirk(uaa, UQ_BAD_ADC)) + sc->sc_uq_bad_adc = 1; umidi_init(dev); - usbd_set_device_desc(dev); + device_set_usb2_desc(dev); - id = usbd_get_interface_descriptor(uaa->iface); + id = usb2_get_interface_descriptor(uaa->iface); uaudio_chan_fill_info(sc, uaa->device); uaudio_mixer_fill_info(sc, uaa->device, id); - sc->sc_mixer_iface_index = uaa->iface_index; - sc->sc_mixer_iface_no = id->bInterfaceNumber; + sc->sc_mixer_iface_index = uaa->info.bIfaceIndex; + sc->sc_mixer_iface_no = uaa->info.bIfaceNum; DPRINTF(0, "audio rev %d.%02x\n", sc->sc_audio_rev >> 8, @@ -782,7 +711,7 @@ } uaudio_mixer_init(sc); - if (sc->sc_quirks & UQ_AUDIO_SWAP_LR) { + if (sc->sc_uq_audio_swap_lr) { DPRINTF(0, "hardware has swapped left and right\n"); uaudio_pcm_setflags(dev, SD_F_PSWAPLR); } @@ -868,7 +797,7 @@ #ifdef USB_DEBUG static void -uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed) +uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed) { if (ed) { DPRINTF(0, "endpoint=%p bLength=%d bDescriptorType=%d \n" @@ -886,18 +815,18 @@ #endif static void -uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usbd_device *udev, +uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb2_device *udev, uint32_t rate, uint16_t fps, uint8_t channels, uint8_t bit_resolution) { - usb_descriptor_t *desc = NULL; - const struct usb_audio_streaming_interface_descriptor *asid = NULL; - const struct usb_audio_streaming_type1_descriptor *asf1d = NULL; - const struct usb_audio_streaming_endpoint_descriptor *sed = NULL; - const usb_endpoint_descriptor_audio_t *ed1 = NULL; - const usb_endpoint_descriptor_audio_t *ed2 = NULL; - usb_config_descriptor_t *cd = usbd_get_config_descriptor(udev); - usb_interface_descriptor_t *id; + struct usb2_descriptor *desc = NULL; + const struct usb2_audio_streaming_interface_descriptor *asid = NULL; + const struct usb2_audio_streaming_type1_descriptor *asf1d = NULL; + const struct usb2_audio_streaming_endpoint_descriptor *sed = NULL; + const usb2_endpoint_descriptor_audio_t *ed1 = NULL; + const usb2_endpoint_descriptor_audio_t *ed2 = NULL; + struct usb2_config_descriptor *cd = usb2_get_config_descriptor(udev); + struct usb2_interface_descriptor *id; const struct uaudio_format *p_fmt; struct uaudio_chan *chan; uint16_t curidx = 0xFFFF; @@ -913,7 +842,7 @@ uint8_t audio_if = 0; uint8_t sample_size; - while ((desc = usbd_desc_foreach(cd, desc))) { + while ((desc = usb2_desc_foreach(cd, desc))) { if ((desc->bDescriptorType == UDESC_INTERFACE) && (desc->bLength >= sizeof(*id))) { @@ -945,7 +874,7 @@ */ if ((sc->sc_midi_chan.valid == 0) && - usbd_get_iface(udev, curidx)) { + usb2_get_iface(udev, curidx)) { sc->sc_midi_chan.iface_index = curidx; sc->sc_midi_chan.iface_alt_index = alt_index; sc->sc_midi_chan.valid = 1; @@ -1028,7 +957,7 @@ ep_type = UE_GET_ISO_TYPE(ed1->bmAttributes); ep_sync = 0; - if ((sc->sc_quirks & UQ_AU_INP_ASYNC) && + if ((sc->sc_uq_au_inp_async) && (ep_dir == UE_DIR_IN) && (ep_type == UE_ISO_ADAPT)) { ep_type = UE_ISO_ASYNC; } @@ -1105,7 +1034,7 @@ &(sc->sc_rec_chan) : &(sc->sc_play_chan); - if ((chan->valid == 0) && usbd_get_iface(udev, curidx)) { + if ((chan->valid == 0) && usb2_get_iface(udev, curidx)) { chan->valid = 1; #ifdef USB_DEBUG @@ -1133,7 +1062,7 @@ chan->iface_index = curidx; chan->iface_alt_index = alt_index; - chan->usb_cfg = + chan->usb2_cfg = (ep_dir == UE_DIR_IN) ? ((fps == 1000) ? uaudio_cfg_record_full_speed : @@ -1167,11 +1096,11 @@ } static void -uaudio_chan_fill_info(struct uaudio_softc *sc, struct usbd_device *udev) +uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb2_device *udev) { uint32_t rate = uaudio_default_rate; uint32_t z; - uint16_t fps = (usbd_get_speed(udev) == USB_SPEED_HIGH) ? 8000 : 1000; + uint16_t fps = (usb2_get_speed(udev) == USB_SPEED_HIGH) ? 8000 : 1000; uint8_t bits = uaudio_default_bits; uint8_t y; uint8_t channels = uaudio_default_channels; @@ -1206,7 +1135,7 @@ } static void -uaudio_chan_play_callback(struct usbd_xfer *xfer) +uaudio_chan_play_callback(struct usb2_xfer *xfer) { struct uaudio_chan *ch = xfer->priv_sc; uint32_t *p_len = xfer->frlengths; @@ -1214,8 +1143,8 @@ uint32_t total = (ch->bytes_per_frame * xfer->nframes); uint32_t offset; - switch (USBD_GET_STATE(xfer)) { - case USBD_ST_TRANSFERRED: + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: tr_transferred: if (xfer->actlen < xfer->sumlen) { DPRINTF(0, "short transfer, " @@ -1223,7 +1152,7 @@ } chn_intr(ch->pcm_ch); - case USBD_ST_SETUP: + case USB_ST_SETUP: if (ch->bytes_per_frame > xfer->max_frame_size) { DPRINTF(0, "bytes per transfer, %d, " "exceeds maximum, %d!\n", @@ -1249,7 +1178,7 @@ if (n > total) { n = total; } - usbd_copy_in(xfer->frbuffers, offset, ch->cur, n); + usb2_copy_in(xfer->frbuffers, offset, ch->cur, n); total -= n; ch->cur += n; @@ -1260,11 +1189,11 @@ } } - usbd_start_hardware(xfer); + usb2_start_hardware(xfer); return; default: /* Error */ - if (xfer->error == USBD_ERR_CANCELLED) { + if (xfer->error == USB_ERR_CANCELLED) { return; } goto tr_transferred; @@ -1272,7 +1201,7 @@ } static void -uaudio_chan_record_callback(struct usbd_xfer *xfer) +uaudio_chan_record_callback(struct usb2_xfer *xfer) { struct uaudio_chan *ch = xfer->priv_sc; uint32_t *p_len = xfer->frlengths; @@ -1282,8 +1211,8 @@ uint32_t offset0; uint32_t offset1; - switch (USBD_GET_STATE(xfer)) { - case USBD_ST_TRANSFERRED: + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: tr_transferred: if (xfer->actlen < total) { DPRINTF(0, "short transfer, " @@ -1305,7 +1234,7 @@ if (m > p_len[n]) { m = p_len[n]; } - usbd_copy_out(xfer->frbuffers, offset1, ch->cur, m); + usb2_copy_out(xfer->frbuffers, offset1, ch->cur, m); p_len[n] -= m; offset1 += m; @@ -1321,7 +1250,7 @@ chn_intr(ch->pcm_ch); - case USBD_ST_SETUP: + case USB_ST_SETUP: if (ch->bytes_per_frame > xfer->max_frame_size) { DPRINTF(0, "bytes per transfer, %d, " "exceeds maximum, %d!\n", @@ -1337,11 +1266,11 @@ DPRINTF(0, "no buffer!\n"); return; } - usbd_start_hardware(xfer); + usb2_start_hardware(xfer); return; default: /* Error */ - if (xfer->error == USBD_ERR_CANCELLED) { + if (xfer->error == USB_ERR_CANCELLED) { return; } goto tr_transferred; @@ -1357,7 +1286,7 @@ uint8_t endpoint; uint8_t iface_index; uint8_t alt_index; - usbd_status_t err; + usb2_error_t err; ch->buf = malloc(sc->sc_buffer_size, M_DEVBUF, M_WAITOK | M_ZERO); @@ -1405,13 +1334,13 @@ DPRINTF(0, "endpoint=0x%02x, speed=%d, iface=%d alt=%d\n", endpoint, ch->sample_rate, iface_index, alt_index); - err = usbd_set_alt_interface_index(sc->sc_udev, iface_index, alt_index); + err = usb2_set_alt_interface_index(sc->sc_udev, iface_index, alt_index); if (err) { DPRINTF(0, "setting of alternate index failed: %s!\n", - usbd_errstr(err)); + usb2_errstr(err)); goto error; } - USBD_SET_IFACE_NO_PROBE(sc->sc_udev, iface_index); + usb2_set_parent_iface(sc->sc_udev, iface_index, sc->sc_mixer_iface_index); /* * If just one sampling rate is supported, @@ -1427,8 +1356,8 @@ DPRINTF(0, "setting of sample rate failed! (continuing anyway)\n"); } } - if (usbd_transfer_setup(sc->sc_udev, &iface_index, ch->xfer, - ch->usb_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) { + if (usb2_transfer_setup(sc->sc_udev, &iface_index, ch->xfer, + ch->usb2_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) { DPRINTF(0, "could not allocate USB transfers!\n"); goto error; } @@ -1446,7 +1375,7 @@ free(ch->buf, M_DEVBUF); ch->buf = NULL; } - usbd_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS); + usb2_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS); ch->valid = 0; @@ -1533,10 +1462,10 @@ #error "please update code" #endif if (ch->xfer[0]) { - usbd_transfer_start(ch->xfer[0]); + usb2_transfer_start(ch->xfer[0]); } if (ch->xfer[1]) { - usbd_transfer_start(ch->xfer[1]); + usb2_transfer_start(ch->xfer[1]); } return (0); } @@ -1547,8 +1476,8 @@ #if (UAUDIO_NCHANBUFS != 2) #error "please update code" #endif - usbd_transfer_stop(ch->xfer[0]); - usbd_transfer_stop(ch->xfer[1]); + usb2_transfer_stop(ch->xfer[0]); + usb2_transfer_stop(ch->xfer[1]); return (0); } @@ -1639,7 +1568,7 @@ const struct uaudio_terminal_node *iot, int id) { #ifdef USB_DEBUG - const struct usb_audio_input_terminal *d = iot[id].u.it; + const struct usb2_audio_input_terminal *d = iot[id].u.it; DPRINTF(2, "bTerminalId=%d wTerminalType=0x%04x " "bAssocTerminal=%d bNrChannels=%d wChannelConfig=%d " @@ -1656,7 +1585,7 @@ const struct uaudio_terminal_node *iot, int id) { #ifdef USB_DEBUG - const struct usb_audio_output_terminal *d = iot[id].u.ot; + const struct usb2_audio_output_terminal *d = iot[id].u.ot; DPRINTF(2, "bTerminalId=%d wTerminalType=0x%04x " "bAssocTerminal=%d bSourceId=%d iTerminal=%d\n", @@ -1672,8 +1601,8 @@ { struct uaudio_mixer_node mix; - const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu; - const struct usb_audio_mixer_unit_1 *d1; + const struct usb2_audio_mixer_unit_0 *d0 = iot[id].u.mu; + const struct usb2_audio_mixer_unit_1 *d1; uint32_t bno; /* bit number */ uint32_t p; /* bit number accumulator */ @@ -1756,7 +1685,7 @@ uaudio_mixer_add_selector(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb_audio_selector_unit *d = iot[id].u.su; + const struct usb2_audio_selector_unit *d = iot[id].u.su; struct uaudio_mixer_node mix; struct uaudio_mixer_node dummy; uint16_t i; @@ -1797,7 +1726,7 @@ } static uint32_t -uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d, +uaudio_mixer_feature_get_bmaControls(const struct usb2_audio_feature_unit *d, uint8_t index) { uint32_t temp = 0; @@ -1822,7 +1751,7 @@ uaudio_mixer_add_feature(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb_audio_feature_unit *d = iot[id].u.fu; + const struct usb2_audio_feature_unit *d = iot[id].u.fu; struct uaudio_mixer_node mix; uint32_t fumask; uint32_t mmask; @@ -1949,10 +1878,10 @@ uaudio_mixer_add_processing_updown(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu; - const struct usb_audio_processing_unit_1 *d1 = + const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu; + const struct usb2_audio_processing_unit_1 *d1 = (const void *)(d0->baSourceId + d0->bNrInPins); - const struct usb_audio_processing_unit_updown *ud = + const struct usb2_audio_processing_unit_updown *ud = (const void *)(d1->bmControls + d1->bControlSize); struct uaudio_mixer_node mix; uint8_t i; @@ -1992,8 +1921,8 @@ uaudio_mixer_add_processing(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu; - const struct usb_audio_processing_unit_1 *d1 = + const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu; + const struct usb2_audio_processing_unit_1 *d1 = (const void *)(d0->baSourceId + d0->bNrInPins); struct uaudio_mixer_node mix; uint16_t ptype; @@ -2038,15 +1967,15 @@ uaudio_mixer_add_extension(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu; - const struct usb_audio_extension_unit_1 *d1 = + const struct usb2_audio_extension_unit_0 *d0 = iot[id].u.eu; + const struct usb2_audio_extension_unit_1 *d1 = (const void *)(d0->baSourceId + d0->bNrInPins); struct uaudio_mixer_node mix; DPRINTF(2, "bUnitId=%d bNrInPins=%d\n", d0->bUnitId, d0->bNrInPins); - if (sc->sc_quirks & UQ_AU_NO_XU) { + if (sc->sc_uq_au_no_xu) { return; } if (d1->bControlSize == 0) { @@ -2070,19 +1999,19 @@ static const void * uaudio_mixer_verify_desc(const void *arg, uint32_t len) { - const struct usb_audio_mixer_unit_1 *d1; - const struct usb_audio_extension_unit_1 *e1; - const struct usb_audio_processing_unit_1 *u1; + const struct usb2_audio_mixer_unit_1 *d1; + const struct usb2_audio_extension_unit_1 *e1; + const struct usb2_audio_processing_unit_1 *u1; union { - const usb_descriptor_t *desc; - const struct usb_audio_input_terminal *it; - const struct usb_audio_output_terminal *ot; - const struct usb_audio_mixer_unit_0 *mu; - const struct usb_audio_selector_unit *su; - const struct usb_audio_feature_unit *fu; - const struct usb_audio_processing_unit_0 *pu; - const struct usb_audio_extension_unit_0 *eu; + const struct usb2_descriptor *desc; + const struct usb2_audio_input_terminal *it; + const struct usb2_audio_output_terminal *ot; + const struct usb2_audio_mixer_unit_0 *mu; + const struct usb2_audio_selector_unit *su; + const struct usb2_audio_feature_unit *fu; + const struct usb2_audio_processing_unit_0 *pu; + const struct usb2_audio_extension_unit_0 *eu; } u; u.desc = arg; @@ -2206,7 +2135,7 @@ }; uint16_t cc; uint8_t i; - const struct usb_audio_cluster cl = uaudio_mixer_get_cluster(id, iot); + const struct usb2_audio_cluster cl = uaudio_mixer_get_cluster(id, iot); >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807012144.m61LisVj091287>