Преглед на файлове

ALSA: fireworks/firewire-lib: Add a quirk to reset data block counter at bus reset

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>
Takashi Sakamoto преди 11 години
родител
ревизия
b84b1a27b4
променени са 3 файла, в които са добавени 8 реда и са изтрити 1 реда
  1. 3 1
      sound/firewire/amdtp.c
  2. 3 0
      sound/firewire/amdtp.h
  3. 2 0
      sound/firewire/fireworks/fireworks_stream.c

+ 3 - 1
sound/firewire/amdtp.c

@@ -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))

+ 3 - 0
sound/firewire/amdtp.h

@@ -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,
 };
 
 /**

+ 2 - 0
sound/firewire/fireworks/fireworks_stream.c

@@ -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;