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

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
...@@ -815,7 +815,7 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed) ...@@ -815,7 +815,7 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
}; };
unsigned int header_size; unsigned int header_size;
enum dma_data_direction dir; enum dma_data_direction dir;
int type, err; int type, tag, err;
mutex_lock(&s->mutex); mutex_lock(&s->mutex);
...@@ -869,9 +869,12 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed) ...@@ -869,9 +869,12 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
} while (s->packet_index > 0); } while (s->packet_index > 0);
/* NOTE: TAG1 matches CIP. This just affects in stream. */ /* 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; s->callbacked = false;
err = fw_iso_context_start(s->context, -1, 0, err = fw_iso_context_start(s->context, -1, 0, tag);
FW_ISO_CONTEXT_MATCH_TAG1);
if (err < 0) if (err < 0)
goto err_context; goto err_context;
......
...@@ -18,11 +18,13 @@ ...@@ -18,11 +18,13 @@
* the overall sample rate comes out right. * the overall sample rate comes out right.
* @CIP_SYNC_TO_DEVICE: In sync to device mode, time stamp in out packets is * @CIP_SYNC_TO_DEVICE: In sync to device mode, time stamp in out packets is
* generated by in packets. Defaultly this driver generates timestamp. * 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 { enum cip_flags {
CIP_NONBLOCKING = 0x00, CIP_NONBLOCKING = 0x00,
CIP_BLOCKING = 0x01, CIP_BLOCKING = 0x01,
CIP_SYNC_TO_DEVICE = 0x02, CIP_SYNC_TO_DEVICE = 0x02,
CIP_EMPTY_WITH_TAG0 = 0x04,
}; };
/** /**
......
...@@ -194,6 +194,8 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) ...@@ -194,6 +194,8 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
err = init_stream(efw, &efw->tx_stream); err = init_stream(efw, &efw->tx_stream);
if (err < 0) if (err < 0)
goto end; goto end;
/* Fireworks transmits NODATA packets with TAG0. */
efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0;
err = init_stream(efw, &efw->rx_stream); err = init_stream(efw, &efw->rx_stream);
if (err < 0) { if (err < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment