* [PATCH] ALSA: USB: adjust for changed 3.8 USB API
@ 2013-04-27 10:10 Clemens Ladisch
2013-04-27 13:08 ` Eldad Zack
2013-04-29 8:58 ` Takashi Iwai
0 siblings, 2 replies; 3+ messages in thread
From: Clemens Ladisch @ 2013-04-27 10:10 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Alan Stern
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@fairlystable.org>
Cc: <stable@vger.kernel.org> # 3.8 only
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
---
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;
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] ALSA: USB: adjust for changed 3.8 USB API
2013-04-27 10:10 [PATCH] ALSA: USB: adjust for changed 3.8 USB API Clemens Ladisch
@ 2013-04-27 13:08 ` Eldad Zack
2013-04-29 8:58 ` Takashi Iwai
1 sibling, 0 replies; 3+ messages in thread
From: Eldad Zack @ 2013-04-27 13:08 UTC (permalink / raw)
To: Clemens Ladisch; +Cc: Takashi Iwai, alsa-devel, Alan Stern
On Sat, 27 Apr 2013, 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@fairlystable.org>
> Cc: <stable@vger.kernel.org> # 3.8 only
> Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
This is slightly offtopic but related:
I figured a change of these semantics might impact consistent latency,
so I went ahead and tested this. It turns out that with my device
(uses implicit feedback) on current mainline I get up to +/- 10 frames
change across stream restarts, while with 3.7.0 I get +/- 1 frame
change.
I restarted the stream about 20 times with each kernel.
So I tested this patch to see if it helps, but there's no change for my
setup with 3.9.
Cheers,
Eldad
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] ALSA: USB: adjust for changed 3.8 USB API
2013-04-27 10:10 [PATCH] ALSA: USB: adjust for changed 3.8 USB API Clemens Ladisch
2013-04-27 13:08 ` Eldad Zack
@ 2013-04-29 8:58 ` Takashi Iwai
1 sibling, 0 replies; 3+ messages in thread
From: Takashi Iwai @ 2013-04-29 8:58 UTC (permalink / raw)
To: Clemens Ladisch; +Cc: alsa-devel, Alan Stern
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@fairlystable.org>
> Cc: <stable@vger.kernel.org> # 3.8 only
> Signed-off-by: Clemens Ladisch <clemens@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;
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-04-29 8:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-27 10:10 [PATCH] ALSA: USB: adjust for changed 3.8 USB API Clemens Ladisch
2013-04-27 13:08 ` Eldad Zack
2013-04-29 8:58 ` Takashi Iwai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.