Преглед изворни кода

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]);
 		page_bus = page_private(buffer->pages[page]);
 		db->second_buffer = cpu_to_le32(page_bus + offset);
 		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);
 		context_append(&ctx->context, d, z, header_z);
 		offset = (offset + length) & ~PAGE_MASK;
 		offset = (offset + length) & ~PAGE_MASK;
 		rest -= length;
 		rest -= length;
 		page++;
 		page++;
 	}
 	}
 
 
-	if (p->interrupt)
-		db->control |= cpu_to_le16(descriptor_irq_always);
-
 	return 0;
 	return 0;
 }
 }
  
  
@@ -1668,6 +1668,9 @@ ohci_queue_iso_receive_bufferfill(struct fw_iso_context *base,
 		d->req_count = cpu_to_le16(length);
 		d->req_count = cpu_to_le16(length);
 		d->res_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);
 		context_append(&ctx->context, d, 1, 0);
 
 
 		offset = (offset + length) & ~PAGE_MASK;
 		offset = (offset + length) & ~PAGE_MASK;
@@ -1675,9 +1678,6 @@ ohci_queue_iso_receive_bufferfill(struct fw_iso_context *base,
 		page++;
 		page++;
 	}
 	}
 
 
-	if (packet->interrupt)
-		d->control |= cpu_to_le16(descriptor_irq_always);
-
 	return 0;
 	return 0;
 }
 }