Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b84b1a27 authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai
Browse files

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: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d9cd0065
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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;