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: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
committed by
Stefan Richter
parent
73864012f3
commit
910e76c607
@@ -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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user