Commit 910e76c6 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Stefan Richter

firewire: ohci: factor out iso completion flushing code

In preparation for the following patches that add more flushing, move
the code for flushing accumulated header data into a common function.
The timestamp of the last completed packed is passed through the context
structure instead of a function parameter to allow accessing this value
later outside of the handle_i?_packet functions.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent 73864012
...@@ -172,7 +172,7 @@ struct iso_context { ...@@ -172,7 +172,7 @@ struct iso_context {
struct context context; struct context context;
void *header; void *header;
size_t header_length; size_t header_length;
u16 last_timestamp;
u8 sync; u8 sync;
u8 tags; u8 tags;
}; };
...@@ -2676,6 +2676,14 @@ static void ohci_write_csr(struct fw_card *card, int csr_offset, u32 value) ...@@ -2676,6 +2676,14 @@ static void ohci_write_csr(struct fw_card *card, int csr_offset, u32 value)
} }
} }
static void flush_iso_completions(struct iso_context *ctx)
{
ctx->base.callback.sc(&ctx->base, ctx->last_timestamp,
ctx->header_length, ctx->header,
ctx->base.callback_data);
ctx->header_length = 0;
}
static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr) static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr)
{ {
u32 *ctx_hdr; u32 *ctx_hdr;
...@@ -2684,6 +2692,7 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr) ...@@ -2684,6 +2692,7 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr)
return; return;
ctx_hdr = ctx->header + ctx->header_length; ctx_hdr = ctx->header + ctx->header_length;
ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]);
/* /*
* The two iso header quadlets are byteswapped to little * The two iso header quadlets are byteswapped to little
...@@ -2707,8 +2716,6 @@ static int handle_ir_packet_per_buffer(struct context *context, ...@@ -2707,8 +2716,6 @@ static int handle_ir_packet_per_buffer(struct context *context,
container_of(context, struct iso_context, context); container_of(context, struct iso_context, context);
struct descriptor *pd; struct descriptor *pd;
u32 buffer_dma; u32 buffer_dma;
__le32 *ir_header;
void *p;
for (pd = d; pd <= last; pd++) for (pd = d; pd <= last; pd++)
if (pd->transfer_status) if (pd->transfer_status)
...@@ -2727,17 +2734,10 @@ static int handle_ir_packet_per_buffer(struct context *context, ...@@ -2727,17 +2734,10 @@ static int handle_ir_packet_per_buffer(struct context *context,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
} }
p = last + 1; copy_iso_headers(ctx, (u32 *) (last + 1));
copy_iso_headers(ctx, p);
if (last->control & cpu_to_le16(DESCRIPTOR_IRQ_ALWAYS)) { if (last->control & cpu_to_le16(DESCRIPTOR_IRQ_ALWAYS))
ir_header = (__le32 *) p; flush_iso_completions(ctx);
ctx->base.callback.sc(&ctx->base,
le32_to_cpu(ir_header[0]) & 0xffff,
ctx->header_length, ctx->header,
ctx->base.callback_data);
ctx->header_length = 0;
}
return 1; return 1;
} }
...@@ -2834,12 +2834,11 @@ static int handle_it_packet(struct context *context, ...@@ -2834,12 +2834,11 @@ static int handle_it_packet(struct context *context,
le16_to_cpu(pd->res_count)); le16_to_cpu(pd->res_count));
ctx->header_length += 4; ctx->header_length += 4;
} }
if (last->control & cpu_to_le16(DESCRIPTOR_IRQ_ALWAYS)) {
ctx->base.callback.sc(&ctx->base, le16_to_cpu(last->res_count), ctx->last_timestamp = le16_to_cpu(last->res_count);
ctx->header_length, ctx->header, if (last->control & cpu_to_le16(DESCRIPTOR_IRQ_ALWAYS))
ctx->base.callback_data); flush_iso_completions(ctx);
ctx->header_length = 0;
}
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment