aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-ohci.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-02-16 17:34:38 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-03-09 16:02:57 -0500
commit9aad8125389a7a2990dee72d7892e22330a945eb (patch)
tree2566a8985837b000990db7e16b17547d3747141b /drivers/firewire/fw-ohci.c
parent6e2e8424d310507fa044649435114217826ed78a (diff)
firewire: Split the iso buffer out from fw_iso_context and avoid vmalloc.
This patch splits out the iso buffer so we can initialize it at mmap time with the size provided in the mmap call. Furthermore, allocate the backing pages using alloc_page to avoid setting up kernel side virtual memory mappings for the pages. 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, 8 insertions, 4 deletions
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
index 72f80361fc43..8499d70bf9ee 100644
--- a/drivers/firewire/fw-ohci.c
+++ b/drivers/firewire/fw-ohci.c
@@ -1251,14 +1251,16 @@ static void ohci_free_iso_context(struct fw_iso_context *base)
1251 1251
1252static int 1252static int
1253ohci_queue_iso(struct fw_iso_context *base, 1253ohci_queue_iso(struct fw_iso_context *base,
1254 struct fw_iso_packet *packet, void *payload) 1254 struct fw_iso_packet *packet,
1255 struct fw_iso_buffer *buffer,
1256 unsigned long payload)
1255{ 1257{
1256 struct iso_context *ctx = (struct iso_context *)base; 1258 struct iso_context *ctx = (struct iso_context *)base;
1257 struct fw_ohci *ohci = fw_ohci(ctx->base.card); 1259 struct fw_ohci *ohci = fw_ohci(ctx->base.card);
1258 struct descriptor *d, *end, *last, *tail, *pd; 1260 struct descriptor *d, *end, *last, *tail, *pd;
1259 struct fw_iso_packet *p; 1261 struct fw_iso_packet *p;
1260 __le32 *header; 1262 __le32 *header;
1261 dma_addr_t d_bus; 1263 dma_addr_t d_bus, page_bus;
1262 u32 z, header_z, payload_z, irq; 1264 u32 z, header_z, payload_z, irq;
1263 u32 payload_index, payload_end_index, next_page_index; 1265 u32 payload_index, payload_end_index, next_page_index;
1264 int index, page, end_page, i, length, offset; 1266 int index, page, end_page, i, length, offset;
@@ -1267,7 +1269,7 @@ ohci_queue_iso(struct fw_iso_context *base,
1267 * packet, retransmit or terminate.. */ 1269 * packet, retransmit or terminate.. */
1268 1270
1269 p = packet; 1271 p = packet;
1270 payload_index = payload - ctx->base.buffer; 1272 payload_index = payload;
1271 d = ctx->head_descriptor; 1273 d = ctx->head_descriptor;
1272 tail = ctx->tail_descriptor; 1274 tail = ctx->tail_descriptor;
1273 end = ctx->buffer + ISO_BUFFER_SIZE / sizeof(struct descriptor); 1275 end = ctx->buffer + ISO_BUFFER_SIZE / sizeof(struct descriptor);
@@ -1337,7 +1339,9 @@ ohci_queue_iso(struct fw_iso_context *base,
1337 length = 1339 length =
1338 min(next_page_index, payload_end_index) - payload_index; 1340 min(next_page_index, payload_end_index) - payload_index;
1339 pd[i].req_count = cpu_to_le16(length); 1341 pd[i].req_count = cpu_to_le16(length);
1340 pd[i].data_address = cpu_to_le32(ctx->base.pages[page] + offset); 1342
1343 page_bus = page_private(buffer->pages[page]);
1344 pd[i].data_address = cpu_to_le32(page_bus + offset);
1341 1345
1342 payload_index += length; 1346 payload_index += length;
1343 } 1347 }