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

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

ALSA: fireworks/firewire-lib: Add a quirk for empty packet with TAG0



Fireworks has a quirk to transmit empty packets with TAG0. This commit
adds handling this quirk for full duplex stream synchronization.

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

+2 −0
Original line number Diff line number Diff line
@@ -18,11 +18,13 @@
 *	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,
};

/**
+2 −0
Original line number Diff line number Diff line
@@ -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) {