mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
firewire: ohci: fix too-early completion of IR multichannel buffers
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 <clemens@ladisch.de> Cc: 2.6.36+ <stable@vger.kernel.org> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
parent
cfda62baa4
commit
0c0efbacab
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user