[alsa-devel] [PATCH] ALSA: USB: adjust for changed 3.8 USB API
Takashi Iwai
tiwai at suse.de
Mon Apr 29 10:58:36 CEST 2013
At Sat, 27 Apr 2013 12:10:32 +0200,
Clemens Ladisch wrote:
>
> The recent changes in the USB API ("implement new semantics for
> URB_ISO_ASAP") made the former meaning of the URB_ISO_ASAP flag the
> default, and changed this flag to mean that URBs can be delayed.
> This is not the behaviour wanted by any of the audio drivers because
> it leads to discontinuous playback with very small period sizes.
> Therefore, our URBs need to be submitted without this flag.
>
> Reported-by: Joe Rayhawk <jrayhawk at fairlystable.org>
> Cc: <stable at vger.kernel.org> # 3.8 only
> Signed-off-by: Clemens Ladisch <clemens at ladisch.de>
Thanks, applied.
Takashi
> ---
> sound/usb/6fire/pcm.c | 1 -
> sound/usb/caiaq/audio.c | 3 ---
> sound/usb/endpoint.c | 5 ++---
> sound/usb/misc/ua101.c | 3 +--
> sound/usb/usx2y/usb_stream.c | 1 -
> sound/usb/usx2y/usbusx2yaudio.c | 1 -
> sound/usb/usx2y/usx2yhwdeppcm.c | 1 -
> 7 files changed, 3 insertions(+), 12 deletions(-)
>
> diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c
> index e2ca12f..40dd50a 100644
> --- a/sound/usb/6fire/pcm.c
> +++ b/sound/usb/6fire/pcm.c
> @@ -575,7 +575,6 @@ static void usb6fire_pcm_init_urb(struct pcm_urb *urb,
> urb->instance.pipe = in ? usb_rcvisocpipe(chip->dev, ep)
> : usb_sndisocpipe(chip->dev, ep);
> urb->instance.interval = 1;
> - urb->instance.transfer_flags = URB_ISO_ASAP;
> urb->instance.complete = handler;
> urb->instance.context = urb;
> urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB;
> diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c
> index fde9a7a..b45e29b 100644
> --- a/sound/usb/caiaq/audio.c
> +++ b/sound/usb/caiaq/audio.c
> @@ -670,7 +670,6 @@ static void read_completed(struct urb *urb)
>
> if (send_it) {
> out->number_of_packets = outframe;
> - out->transfer_flags = URB_ISO_ASAP;
> usb_submit_urb(out, GFP_ATOMIC);
> } else {
> struct snd_usb_caiaq_cb_info *oinfo = out->context;
> @@ -686,7 +685,6 @@ requeue:
> }
>
> urb->number_of_packets = FRAMES_PER_URB;
> - urb->transfer_flags = URB_ISO_ASAP;
> usb_submit_urb(urb, GFP_ATOMIC);
> }
>
> @@ -751,7 +749,6 @@ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret)
> * BYTES_PER_FRAME;
> urbs[i]->context = &dev->data_cb_info[i];
> urbs[i]->interval = 1;
> - urbs[i]->transfer_flags = URB_ISO_ASAP;
> urbs[i]->number_of_packets = FRAMES_PER_URB;
> urbs[i]->complete = (dir == SNDRV_PCM_STREAM_CAPTURE) ?
> read_completed : write_completed;
> diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
> index 21049b8..63cca3a 100644
> --- a/sound/usb/endpoint.c
> +++ b/sound/usb/endpoint.c
> @@ -677,7 +677,7 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep,
> if (!u->urb->transfer_buffer)
> goto out_of_memory;
> u->urb->pipe = ep->pipe;
> - u->urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
> + u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
> u->urb->interval = 1 << ep->datainterval;
> u->urb->context = u;
> u->urb->complete = snd_complete_urb;
> @@ -716,8 +716,7 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep,
> u->urb->transfer_dma = ep->sync_dma + i * 4;
> u->urb->transfer_buffer_length = 4;
> u->urb->pipe = ep->pipe;
> - u->urb->transfer_flags = URB_ISO_ASAP |
> - URB_NO_TRANSFER_DMA_MAP;
> + u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
> u->urb->number_of_packets = 1;
> u->urb->interval = 1 << ep->syncinterval;
> u->urb->context = u;
> diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c
> index 8b81cb5..6ad617b 100644
> --- a/sound/usb/misc/ua101.c
> +++ b/sound/usb/misc/ua101.c
> @@ -1120,8 +1120,7 @@ static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream,
> usb_init_urb(&urb->urb);
> urb->urb.dev = ua->dev;
> urb->urb.pipe = stream->usb_pipe;
> - urb->urb.transfer_flags = URB_ISO_ASAP |
> - URB_NO_TRANSFER_DMA_MAP;
> + urb->urb.transfer_flags = URB_NO_TRANSFER_DMA_MAP;
> urb->urb.transfer_buffer = addr;
> urb->urb.transfer_dma = dma;
> urb->urb.transfer_buffer_length = max_packet_size;
> diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
> index 1e7a47a..bf618e1 100644
> --- a/sound/usb/usx2y/usb_stream.c
> +++ b/sound/usb/usx2y/usb_stream.c
> @@ -69,7 +69,6 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
> ++u, transfer += transfer_length) {
> struct urb *urb = urbs[u];
> struct usb_iso_packet_descriptor *desc;
> - urb->transfer_flags = URB_ISO_ASAP;
> urb->transfer_buffer = transfer;
> urb->dev = dev;
> urb->pipe = pipe;
> diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c
> index 520ef96..b376532 100644
> --- a/sound/usb/usx2y/usbusx2yaudio.c
> +++ b/sound/usb/usx2y/usbusx2yaudio.c
> @@ -503,7 +503,6 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs)
> if (0 == i)
> atomic_set(&subs->state, state_STARTING3);
> urb->dev = usX2Y->dev;
> - urb->transfer_flags = URB_ISO_ASAP;
> for (pack = 0; pack < nr_of_packs(); pack++) {
> urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack;
> urb->iso_frame_desc[pack].length = subs->maxpacksize;
> diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c
> index cc56007..f2a1acd 100644
> --- a/sound/usb/usx2y/usx2yhwdeppcm.c
> +++ b/sound/usb/usx2y/usx2yhwdeppcm.c
> @@ -443,7 +443,6 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs)
> if (0 == u)
> atomic_set(&subs->state, state_STARTING3);
> urb->dev = usX2Y->dev;
> - urb->transfer_flags = URB_ISO_ASAP;
> for (pack = 0; pack < nr_of_packs(); pack++) {
> urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs());
> urb->iso_frame_desc[pack].length = subs->maxpacksize;
>
More information about the Alsa-devel
mailing list