Skip to content

Commit

Permalink
firewire: ohci: fix too-early completion of IR multichannel buffers
Browse files Browse the repository at this point in the history
handle_ir_buffer_fill() assumed that a completed descriptor would be
indicated by a non-zero transfer_status (as in most other descriptors).
However, this field is written by the controller as soon as (the end of)
the first packet has been written into the buffer.  As a consequence, if
we happen to run into such a descriptor when the interrupt handler is
executed after such a packet has completed, the descriptor would be
taken out of the list of active descriptors as soon as the buffer had
been partially filled, so the event for the buffer being completely
filled would never be sent.

To fix this, handle descriptors only when they have been completely
filled, i.e., when res_count == 0.  (This also matches the condition
that is reported by the controller with an interrupt.)

Signed-off-by: Clemens Ladisch <[email protected]>
Cc: 2.6.36+ <[email protected]>
Signed-off-by: Stefan Richter <[email protected]>
  • Loading branch information
cladisch authored and Stefan Richter committed Mar 17, 2012
1 parent cfda62b commit 0c0efba
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions drivers/firewire/ohci.c
Original file line number Diff line number Diff line change
Expand Up @@ -2751,7 +2751,7 @@ static int handle_ir_buffer_fill(struct context *context,
container_of(context, struct iso_context, context);
u32 buffer_dma;

if (!last->transfer_status)
if (last->res_count != 0)
/* Descriptor(s) not done yet, stop iteration */
return 0;

Expand All @@ -2765,8 +2765,7 @@ static int handle_ir_buffer_fill(struct context *context,
if (le16_to_cpu(last->control) & DESCRIPTOR_IRQ_ALWAYS)
ctx->base.callback.mc(&ctx->base,
le32_to_cpu(last->data_address) +
le16_to_cpu(last->req_count) -
le16_to_cpu(last->res_count),
le16_to_cpu(last->req_count),
ctx->base.callback_data);

return 1;
Expand Down

0 comments on commit 0c0efba

Please sign in to comment.