ALSA: firewire-lib: continue packet processing at detecting wrong CIP headers
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 11 Oct 2015 13:33:50 +0000 (22:33 +0900)
committerTakashi Iwai <tiwai@suse.de>
Sun, 11 Oct 2015 16:14:01 +0000 (18:14 +0200)
In firewire-lib, isochronous packet streaming is stopped when detecting
wrong value for FMT field of CIP headers. Although this is appropriate
to IEC 61883-1 and 6, some BeBoB based devices with vendors' customization
use invalid value to FMT field of CIP headers in the beginning of
streaming.

$ journalctl
  snd-bebob fw1.0: Detect unexpected protocol: 01000000 8000ffff

I got this log with M-Audio FireWire 1814. In this line, the value of FMT
field is 0x00, while it should be 0x10 in usual AMDTP.

Except for the beginning, these devices continue to transfer packets with
valid value for FMT field, except for the beginning. Therefore, in this
case, firewire-lib should continue to process packets. The former
implementation of firewire-lib performs it.

This commit loosens the handling of wrong value, to continue packet
processing in the case.

Fixes: 414ba022a528 ('ALSA: firewire-lib: add support arbitrary value for fmt/fdf fields in CIP header')
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp-stream.c

index fa10b58a0957bd660c78752423478364c9f58de9..ed2902609a4c6cd0fd854e6ee29f6eaa866499c0 100644 (file)
@@ -468,10 +468,12 @@ static int handle_in_packet(struct amdtp_stream *s,
        /* Check valid protocol or not. */
        fmt = (cip_header[1] & CIP_FMT_MASK) >> CIP_FMT_SHIFT;
        if (fmt != s->fmt) {
-               dev_err(&s->unit->device,
-                       "Detect unexpected protocol: %08x %08x\n",
-                       cip_header[0], cip_header[1]);
-               return -EIO;
+               dev_info_ratelimited(&s->unit->device,
+                                    "Detect unexpected protocol: %08x %08x\n",
+                                    cip_header[0], cip_header[1]);
+               *data_blocks = 0;
+               pcm_frames = 0;
+               goto end;
        }
 
        /* Calculate data blocks */
This page took 0.030093 seconds and 5 git commands to generate.