[alsa-devel] [PATCH 42/44] bebob/firewire-lib: Add a quirk of wrong dbc in empty packet for M-Audio special Firewire series
Takashi Sakamoto
o-takashi at sakamocchi.jp
Sun Mar 23 03:16:58 CET 2014
I realize this patch includes a bug to cause wrong detection of packet
discontinuity.
> @@ -745,6 +745,8 @@ static void handle_in_packet(struct amdtp_stream *s,
>
> /* Check data block counter continuity */
> data_block_counter = cip_header[0] & AMDTP_DBC_MASK;
> + if (data_blocks == 0 && (s->flags & CIP_EMPTY_HAS_WRONG_DBC))
> + data_block_counter = s->data_block_counter;
> if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
> lost = data_block_counter != s->data_block_counter;
> } else {
These lines should be:
> + if (data_blocks == 0 && (s->flags & CIP_EMPTY_HAS_WRONG_DBC) &&
> + s->data_block_counter != UINT_MAX)
> + data_block_counter = s->data_block_counter;
When CIP_SKIP_INIT_DBC_CHECK is enabled, initial value of
s->data_block_counter is set to UINT_MAX. An intention of this is to
skip detecting discontinuity for a first packet [31/44].
This initial value has a bad effect when CIP_EMPTY_HAS_WRONG_DBC is enabled.
A first packet is an empty packet. When this packet is handled,
data_block_counter is set to initial value of s->data_block_counter
(UINT_MAX). Later, s->data_block_counter is set to 0xff with bitmask in
below lines.
if (s->flags & CIP_DBC_IS_END_EVENT)
s->data_block_counter = data_block_counter;
else
s->data_block_counter =
(data_block_counter + data_blocks) & 0xff;
When a packet with data blocks is handled later, s->data_block_counter
is 0xff, not UINT_MAX. This causes discontinuity detection because this
packet has 0x00 in itx dbc in below lines.
if (lost && s->data_block_counter != UINT_MAX) {
dev_info(&s->unit->device,
"Detect discontinuity of CIP: %02X %02X\n",
s->data_block_counter, data_block_counter);
See this log:
[ 2933.102892] 01020000 9002FFFF 02
[ 2933.102894] 01020000 9002FFFF 02
[ 2933.102896] 01020000 9002FFFF 02
[ 2933.102899] 01020000 9002FFFF 02
[ 2933.102901] 01020000 9002FFFF 02
[ 2933.102903] 01020000 9002FFFF 02
[ 2933.104871] 01110000 900258B5 8A
[ 2933.104877] snd-bebob fw1.0: Detect discontinuity of CIP: FF 00
I'm sorry to post a patch including a bug.
Regards
Takashi Sakamoto
o-takashi at sakamocchi.jp
More information about the Alsa-devel
mailing list