浏览代码

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>
Kristian Høgsberg 18 年之前
父节点
当前提交
cb2d2cdbc6
共有 1 个文件被更改,包括 6 次插入6 次删除
  1. 6 6
      drivers/firewire/fw-ohci.c

+ 6 - 6
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;
 }