ALSA: firewire-lib: Restrict calling flush_context_completion() when context exists
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 25 Apr 2014 13:44:53 +0000 (22:44 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 26 May 2014 12:21:56 +0000 (14:21 +0200)
Currently, drivers can bring XRUN state for PCM substreams when error to
queue packets or detecting discontinuity of packet. The application may try to
recover this state by calling snd_pcm_prepare().

Depending on each driver, .prepare() includes restart streaming. Then there
is a state that PCM substreams are running but isochronous contexts are
stopped. In this case, when .pointer() is called, it refers to error pointer.

This commit is for a prevention of this bug.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp.c

index ac8c35830cd94899939a657a14dbb9f759ba7c59..7c814ace9e58535a1b7f65a8ae6c08a62286d95e 100644 (file)
@@ -898,7 +898,7 @@ EXPORT_SYMBOL(amdtp_stream_start);
 unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s)
 {
        /* this optimization is allowed to be racy */
-       if (s->pointer_flush)
+       if (s->pointer_flush && amdtp_stream_running(s))
                fw_iso_context_flush_completions(s->context);
        else
                s->pointer_flush = true;