diff options
author | Kristian Høgsberg <krh@redhat.com> | 2007-02-16 17:34:47 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-03-09 22:03:02 +0100 |
commit | cb2d2cdbc66d9143159ee0381ad83975de56a57d (patch) | |
tree | cb5431e87633b8c1b09667434ed331e37caee3f7 | |
parent | d2746dc192e8b9446ea1cb843e94c30f177b7e54 (diff) |
firewire: Don't touch DMA descriptors after appending.
When a DMA descriptor is appended to the context we sync it for
DMA and the device might potentially read it immediately. So,
we can't set the IRQ bits in the descriptor after appending.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r-- | drivers/firewire/fw-ohci.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index 9b9ea0f3c41..18769d906ca 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c @@ -1621,15 +1621,15 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base, page_bus = page_private(buffer->pages[page]); db->second_buffer = cpu_to_le32(page_bus + offset); + if (p->interrupt && length == rest) + db->control |= cpu_to_le16(descriptor_irq_always); + context_append(&ctx->context, d, z, header_z); offset = (offset + length) & ~PAGE_MASK; rest -= length; page++; } - if (p->interrupt) - db->control |= cpu_to_le16(descriptor_irq_always); - return 0; } @@ -1668,6 +1668,9 @@ ohci_queue_iso_receive_bufferfill(struct fw_iso_context *base, d->req_count = cpu_to_le16(length); d->res_count = cpu_to_le16(length); + if (packet->interrupt && length == rest) + d->control |= cpu_to_le16(descriptor_irq_always); + context_append(&ctx->context, d, 1, 0); offset = (offset + length) & ~PAGE_MASK; @@ -1675,9 +1678,6 @@ ohci_queue_iso_receive_bufferfill(struct fw_iso_context *base, page++; } - if (packet->interrupt) - d->control |= cpu_to_le16(descriptor_irq_always); - return 0; } |