From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH v2 6/9] ALSA: line6: Allow bulk endpoints instead of interrupt endpoints Date: Wed, 24 Aug 2016 17:02:13 +0200 Message-ID: References: <1470942147-19848-1-git-send-email-dev@andree.sk> <1471558839-14120-1-git-send-email-dev@andree.sk> <1471558839-14120-7-git-send-email-dev@andree.sk> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id 43F53267B1F for ; Wed, 24 Aug 2016 17:02:14 +0200 (CEST) In-Reply-To: <1471558839-14120-7-git-send-email-dev@andree.sk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Andrej Krutak Cc: stefanha@gmail.com, alsa-devel@alsa-project.org, grabner@icg.tugraz.at List-Id: alsa-devel@alsa-project.org 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 > --- > 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 > >