ALSA: fireworks/firewire-lib: Add a quirk to reset data block counter at bus reset
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 25 Apr 2014 13:45:07 +0000 (22:45 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 26 May 2014 12:26:44 +0000 (14:26 +0200)
Fireworks has a quirk to reset data block counter at bus reset.

This commit adds a flag of CIP_SKIP_DBC_ZERO_CHECK. This flag has an effect
to skip checking dbc continuity when dbc is zero.

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 4a7cc1f77d88d8af6c8959ec46697aaac59ae93a..5e13b3f1551659231d43a886fbacb147434c571e 100644 (file)
@@ -662,7 +662,9 @@ static void handle_in_packet(struct amdtp_stream *s,
 
        /* Check data block counter continuity */
        data_block_counter = cip_header[0] & AMDTP_DBC_MASK;
-       if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
+       if ((s->flags & CIP_SKIP_DBC_ZERO_CHECK) && data_block_counter == 0) {
+               lost = false;
+       } else if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
                lost = data_block_counter != s->data_block_counter;
        } else {
                if ((data_blocks > 0) && (s->tx_dbc_interval > 0))
index 05f1b8b30e2b6630e39f71a89cafce87a31e2dae..42c75c916684aa6b93c797d209929a8b6af0317a 100644 (file)
@@ -23,6 +23,8 @@
  *     corresponds to the end of event in the packet. Out of IEC 61883.
  * @CIP_WRONG_DBS: Only for in-stream. The value of dbs is wrong in in-packets.
  *     The value of data_block_quadlets is used instead of reported value.
+ * @SKIP_DBC_ZERO_CHECK: Only for in-stream.  Packets with zero in dbc is
+ *     skipped for detecting discontinuity.
  */
 enum cip_flags {
        CIP_NONBLOCKING         = 0x00,
@@ -31,6 +33,7 @@ enum cip_flags {
        CIP_EMPTY_WITH_TAG0     = 0x04,
        CIP_DBC_IS_END_EVENT    = 0x08,
        CIP_WRONG_DBS           = 0x10,
+       CIP_SKIP_DBC_ZERO_CHECK = 0x20,
 };
 
 /**
index c75c2ef2ae31ad6cbd1b71826d8b8f394cc2129e..3a3f203177b1e3ea5c3f93ca8e654f29d53fb91a 100644 (file)
@@ -198,6 +198,8 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
        efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0;
        /* Fireworks has its own meaning for dbc. */
        efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT;
+       /* Fireworks reset dbc at bus reset. */
+       efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK;
        /* AudioFire9 always reports wrong dbs. */
        if (efw->is_af9)
                efw->tx_stream.flags |= CIP_WRONG_DBS;