ALSA: fireworks/firewire-lib: Add a quirk for empty packet with TAG0
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 25 Apr 2014 13:45:03 +0000 (22:45 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 26 May 2014 12:24:33 +0000 (14:24 +0200)
Fireworks has a quirk to transmit empty packets with TAG0. This commit
adds handling this quirk for full duplex stream synchronization.

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

index 5b88461234744264150e77c662f5ec6c3b387a8d..dce4c6dd3f6de02c3755b603450e892466762509 100644 (file)
@@ -815,7 +815,7 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
        };
        unsigned int header_size;
        enum dma_data_direction dir;
-       int type, err;
+       int type, tag, err;
 
        mutex_lock(&s->mutex);
 
@@ -869,9 +869,12 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
        } while (s->packet_index > 0);
 
        /* NOTE: TAG1 matches CIP. This just affects in stream. */
+       tag = FW_ISO_CONTEXT_MATCH_TAG1;
+       if (s->flags & CIP_EMPTY_WITH_TAG0)
+               tag |= FW_ISO_CONTEXT_MATCH_TAG0;
+
        s->callbacked = false;
-       err = fw_iso_context_start(s->context, -1, 0,
-                                  FW_ISO_CONTEXT_MATCH_TAG1);
+       err = fw_iso_context_start(s->context, -1, 0, tag);
        if (err < 0)
                goto err_context;
 
index 3de34639b1c7fc5a42b73cd0c594ec6e44a91a5b..96b96ec812b2296ed6081753de10189ab48853be 100644 (file)
  *     the overall sample rate comes out right.
  * @CIP_SYNC_TO_DEVICE: In sync to device mode, time stamp in out packets is
  *     generated by in packets. Defaultly this driver generates timestamp.
+ * @CIP_EMPTY_WITH_TAG0: Only for in-stream. Empty in-packets have TAG0.
  */
 enum cip_flags {
        CIP_NONBLOCKING         = 0x00,
        CIP_BLOCKING            = 0x01,
        CIP_SYNC_TO_DEVICE      = 0x02,
+       CIP_EMPTY_WITH_TAG0     = 0x04,
 };
 
 /**
index ec62aa65cfae696bd39c0248041fe5bb7137d852..360e871bf838c33f720f68cb7fdec7446bf51deb 100644 (file)
@@ -194,6 +194,8 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
        err = init_stream(efw, &efw->tx_stream);
        if (err < 0)
                goto end;
+       /* Fireworks transmits NODATA packets with TAG0. */
+       efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0;
 
        err = init_stream(efw, &efw->rx_stream);
        if (err < 0) {