[alsa-devel] [PATCH v2 6/9] ALSA: line6: Allow bulk endpoints instead of interrupt endpoints
Takashi Iwai
tiwai at suse.de
Wed Aug 24 17:02:13 CEST 2016
On Fri, 19 Aug 2016 00:20:36 +0200,
Andrej Krutak wrote:
>
> Some PODs (e.g. POD X3) have bulk instead of interrupt endpoints for
> data transfer.
This patch should be applied before the actual usage of POD X3, so it
should be patch 4.
Takashi
>
> Signed-off-by: Andrej Krutak <dev at andree.sk>
> ---
> sound/usb/line6/driver.c | 63 ++++++++++++++++++++++++++++++++++++------------
> 1 file changed, 48 insertions(+), 15 deletions(-)
>
> diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
> index 5fd6cad..9b16777 100644
> --- a/sound/usb/line6/driver.c
> +++ b/sound/usb/line6/driver.c
> @@ -66,10 +66,17 @@ static int line6_start_listen(struct usb_line6 *line6)
> {
> int err;
>
> - usb_fill_int_urb(line6->urb_listen, line6->usbdev,
> - usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r),
> - line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
> - line6_data_received, line6, line6->interval);
> + if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
> + usb_fill_int_urb(line6->urb_listen, line6->usbdev,
> + usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r),
> + line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
> + line6_data_received, line6, line6->interval);
> + } else {
> + usb_fill_bulk_urb(line6->urb_listen, line6->usbdev,
> + usb_rcvbulkpipe(line6->usbdev, line6->properties->ep_ctrl_r),
> + line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
> + line6_data_received, line6);
> + }
> line6->urb_listen->actual_length = 0;
> err = usb_submit_urb(line6->urb_listen, GFP_ATOMIC);
> return err;
> @@ -90,6 +97,7 @@ static int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
> int size)
> {
> int i, done = 0;
> + const struct line6_properties *properties = line6->properties;
>
> for (i = 0; i < size; i += line6->max_packet_size) {
> int partial;
> @@ -97,15 +105,21 @@ static int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
> int frag_size = min(line6->max_packet_size, size - i);
> int retval;
>
> - retval = usb_interrupt_msg(line6->usbdev,
> - usb_sndintpipe(line6->usbdev,
> - line6->properties->ep_ctrl_w),
> - (char *)frag_buf, frag_size,
> - &partial, LINE6_TIMEOUT * HZ);
> + if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
> + retval = usb_interrupt_msg(line6->usbdev,
> + usb_sndintpipe(line6->usbdev, properties->ep_ctrl_w),
> + (char *)frag_buf, frag_size,
> + &partial, LINE6_TIMEOUT * HZ);
> + } else {
> + retval = usb_bulk_msg(line6->usbdev,
> + usb_sndbulkpipe(line6->usbdev, properties->ep_ctrl_w),
> + (char *)frag_buf, frag_size,
> + &partial, LINE6_TIMEOUT * HZ);
> + }
>
> if (retval) {
> dev_err(line6->ifcdev,
> - "usb_interrupt_msg failed (%d)\n", retval);
> + "usb_bulk_msg failed (%d)\n", retval);
> break;
> }
>
> @@ -140,10 +154,17 @@ static int line6_send_raw_message_async_part(struct message *msg,
> int done = msg->done;
> int bytes = min(msg->size - done, line6->max_packet_size);
>
> - usb_fill_int_urb(urb, line6->usbdev,
> - usb_sndintpipe(line6->usbdev, line6->properties->ep_ctrl_w),
> - (char *)msg->buffer + done, bytes,
> - line6_async_request_sent, msg, line6->interval);
> + if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
> + usb_fill_int_urb(urb, line6->usbdev,
> + usb_sndintpipe(line6->usbdev, line6->properties->ep_ctrl_w),
> + (char *)msg->buffer + done, bytes,
> + line6_async_request_sent, msg, line6->interval);
> + } else {
> + usb_fill_bulk_urb(urb, line6->usbdev,
> + usb_sndbulkpipe(line6->usbdev, line6->properties->ep_ctrl_w),
> + (char *)msg->buffer + done, bytes,
> + line6_async_request_sent, msg);
> + }
>
> msg->done += bytes;
> retval = usb_submit_urb(urb, GFP_ATOMIC);
> @@ -462,7 +483,19 @@ static void line6_destruct(struct snd_card *card)
> static void line6_get_interval(struct usb_line6 *line6)
> {
> struct usb_device *usbdev = line6->usbdev;
> - struct usb_host_endpoint *ep = usbdev->ep_in[line6->properties->ep_ctrl_r];
> + const struct line6_properties *properties = line6->properties;
> + int pipe;
> + struct usb_host_endpoint *ep;
> +
> + if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
> + pipe =
> + usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r);
> + } else {
> + pipe =
> + usb_rcvbulkpipe(line6->usbdev, line6->properties->ep_ctrl_r);
> + }
> + ep = usbdev->ep_in[usb_pipeendpoint(pipe)];
> +
> if (ep) {
> line6->interval = ep->desc.bInterval;
> if (usbdev->speed == USB_SPEED_LOW) {
> --
> 1.9.1
>
>
More information about the Alsa-devel
mailing list