aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-ohci.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-02-16 17:34:47 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-03-09 22:03:02 +0100
commitcb2d2cdbc66d9143159ee0381ad83975de56a57d (patch)
treecb5431e87633b8c1b09667434ed331e37caee3f7 /drivers/firewire/fw-ohci.c
parentd2746dc192e8b9446ea1cb843e94c30f177b7e54 (diff)
downloadkernel_goldelico_gta04-cb2d2cdbc66d9143159ee0381ad83975de56a57d.zip
kernel_goldelico_gta04-cb2d2cdbc66d9143159ee0381ad83975de56a57d.tar.gz
kernel_goldelico_gta04-cb2d2cdbc66d9143159ee0381ad83975de56a57d.tar.bz2
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>
Diffstat (limited to 'drivers/firewire/fw-ohci.c')
-rw-r--r--drivers/firewire/fw-ohci.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
index 9b9ea0f..18769d9 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;
}