Skip to content

Commit

Permalink
ALSA: fireworks/firewire-lib: Add a quirk for wrong dbs in tx packets
Browse files Browse the repository at this point in the history
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: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Sakamoto authored and Takashi Iwai committed May 26, 2014
1 parent c8bdf49 commit 6970223
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 0 deletions.
2 changes: 2 additions & 0 deletions sound/firewire/amdtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,8 @@ static void handle_in_packet(struct amdtp_stream *s,
cip_header[0]);
goto err;
}
if (s->flags & CIP_WRONG_DBS)
data_block_quadlets = s->data_block_quadlets;

data_blocks = (payload_quadlets - 2) / data_block_quadlets;
}
Expand Down
3 changes: 3 additions & 0 deletions sound/firewire/amdtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,16 @@
* @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
* 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 {
CIP_NONBLOCKING = 0x00,
CIP_BLOCKING = 0x01,
CIP_SYNC_TO_DEVICE = 0x02,
CIP_EMPTY_WITH_TAG0 = 0x04,
CIP_DBC_IS_END_EVENT = 0x08,
CIP_WRONG_DBS = 0x10,
};

/**
Expand Down
2 changes: 2 additions & 0 deletions sound/firewire/fireworks/fireworks.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ efw_probe(struct fw_unit *unit,
err = get_hardware_info(efw);
if (err < 0)
goto error;
if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9)
efw->is_af9 = true;

err = snd_efw_stream_init_duplex(efw);
if (err < 0)
Expand Down
3 changes: 3 additions & 0 deletions sound/firewire/fireworks/fireworks.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ struct snd_efw {
u32 seqnum;
bool resp_addr_changable;

/* for quirks */
bool is_af9;

unsigned int midi_in_ports;
unsigned int midi_out_ports;

Expand Down
3 changes: 3 additions & 0 deletions sound/firewire/fireworks/fireworks_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,9 @@ 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;
/* AudioFire9 always reports wrong dbs. */
if (efw->is_af9)
efw->tx_stream.flags |= CIP_WRONG_DBS;

err = init_stream(efw, &efw->rx_stream);
if (err < 0) {
Expand Down

0 comments on commit 6970223

Please sign in to comment.