Commit 69702239 authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: fireworks/firewire-lib: Add a quirk for wrong dbs in tx packets

One of Fireworks firmware, named  as 'AudioFire9', seems to transmit
packets with wrong value of dbs. It's always 0x11 but actual size of
data block is different.

This commit adds a flag for this quirk and some codes to calculate
correct size.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c8bdf49b
...@@ -653,6 +653,8 @@ static void handle_in_packet(struct amdtp_stream *s, ...@@ -653,6 +653,8 @@ static void handle_in_packet(struct amdtp_stream *s,
cip_header[0]); cip_header[0]);
goto err; goto err;
} }
if (s->flags & CIP_WRONG_DBS)
data_block_quadlets = s->data_block_quadlets;
data_blocks = (payload_quadlets - 2) / data_block_quadlets; data_blocks = (payload_quadlets - 2) / data_block_quadlets;
} }
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
* @CIP_EMPTY_WITH_TAG0: Only for in-stream. Empty in-packets have TAG0. * @CIP_EMPTY_WITH_TAG0: Only for in-stream. Empty in-packets have TAG0.
* @CIP_DBC_IS_END_EVENT: Only for in-stream. The value of dbc in an in-packet * @CIP_DBC_IS_END_EVENT: Only for in-stream. The value of dbc in an in-packet
* corresponds to the end of event in the packet. Out of IEC 61883. * 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.
*/ */
enum cip_flags { enum cip_flags {
CIP_NONBLOCKING = 0x00, CIP_NONBLOCKING = 0x00,
...@@ -28,6 +30,7 @@ enum cip_flags { ...@@ -28,6 +30,7 @@ enum cip_flags {
CIP_SYNC_TO_DEVICE = 0x02, CIP_SYNC_TO_DEVICE = 0x02,
CIP_EMPTY_WITH_TAG0 = 0x04, CIP_EMPTY_WITH_TAG0 = 0x04,
CIP_DBC_IS_END_EVENT = 0x08, CIP_DBC_IS_END_EVENT = 0x08,
CIP_WRONG_DBS = 0x10,
}; };
/** /**
......
...@@ -205,6 +205,8 @@ efw_probe(struct fw_unit *unit, ...@@ -205,6 +205,8 @@ efw_probe(struct fw_unit *unit,
err = get_hardware_info(efw); err = get_hardware_info(efw);
if (err < 0) if (err < 0)
goto error; goto error;
if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9)
efw->is_af9 = true;
err = snd_efw_stream_init_duplex(efw); err = snd_efw_stream_init_duplex(efw);
if (err < 0) if (err < 0)
......
...@@ -61,6 +61,9 @@ struct snd_efw { ...@@ -61,6 +61,9 @@ struct snd_efw {
u32 seqnum; u32 seqnum;
bool resp_addr_changable; bool resp_addr_changable;
/* for quirks */
bool is_af9;
unsigned int midi_in_ports; unsigned int midi_in_ports;
unsigned int midi_out_ports; unsigned int midi_out_ports;
......
...@@ -198,6 +198,9 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) ...@@ -198,6 +198,9 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0; efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0;
/* Fireworks has its own meaning for dbc. */ /* Fireworks has its own meaning for dbc. */
efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT;
/* AudioFire9 always reports wrong dbs. */
if (efw->is_af9)
efw->tx_stream.flags |= CIP_WRONG_DBS;
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