diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2012-03-18 19:04:05 +0100 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2012-03-18 22:15:38 +0100 |
commit | 73864012f386ca5a193f3231c9b1936e23709a94 (patch) | |
tree | 0278de90e03579c0bac789173b97faaf13112d2e /drivers/firewire/ohci.c | |
parent | 90fcc8987390bffd79c6fd16aa59cc6ef549efcb (diff) | |
download | linux-73864012f386ca5a193f3231c9b1936e23709a94.tar.gz linux-73864012f386ca5a193f3231c9b1936e23709a94.tar.bz2 linux-73864012f386ca5a193f3231c9b1936e23709a94.zip |
firewire: ohci: simplify iso header pointer arithmetic
When storing the header data of completed iso packets, we effectively
treat the buffers as arrays of quadlets. Actually declaring the
pointers as u32* avoids repetitive pointer arithmetic, removes the
unhelpfully named "i" variables, and thus makes the code clearer.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/ohci.c')
-rw-r--r-- | drivers/firewire/ohci.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index a2fc64cd8b81..1a49743347fb 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c @@ -2676,24 +2676,26 @@ static void ohci_write_csr(struct fw_card *card, int csr_offset, u32 value) } } -static void copy_iso_headers(struct iso_context *ctx, void *p) +static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr) { - int i = ctx->header_length; + u32 *ctx_hdr; - if (i + ctx->base.header_size > PAGE_SIZE) + if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) return; + ctx_hdr = ctx->header + ctx->header_length; + /* * The two iso header quadlets are byteswapped to little * endian by the controller, but we want to present them * as big endian for consistency with the bus endianness. */ if (ctx->base.header_size > 0) - *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4)); + ctx_hdr[0] = swab32(dma_hdr[1]); /* iso packet header */ if (ctx->base.header_size > 4) - *(u32 *) (ctx->header + i + 4) = __swab32(*(u32 *) p); + ctx_hdr[1] = swab32(dma_hdr[0]); /* timestamp */ if (ctx->base.header_size > 8) - memcpy(ctx->header + i + 8, p + 8, ctx->base.header_size - 8); + memcpy(&ctx_hdr[2], &dma_hdr[2], ctx->base.header_size - 8); ctx->header_length += ctx->base.header_size; } @@ -2812,8 +2814,8 @@ static int handle_it_packet(struct context *context, { struct iso_context *ctx = container_of(context, struct iso_context, context); - int i; struct descriptor *pd; + __be32 *ctx_hdr; for (pd = d; pd <= last; pd++) if (pd->transfer_status) @@ -2824,10 +2826,10 @@ static int handle_it_packet(struct context *context, sync_it_packet_for_cpu(context, d); - i = ctx->header_length; - if (i + 4 < PAGE_SIZE) { + if (ctx->header_length + 4 < PAGE_SIZE) { + ctx_hdr = ctx->header + ctx->header_length; /* Present this value as big-endian to match the receive code */ - *(__be32 *)(ctx->header + i) = cpu_to_be32( + *ctx_hdr = cpu_to_be32( ((u32)le16_to_cpu(pd->transfer_status) << 16) | le16_to_cpu(pd->res_count)); ctx->header_length += 4; |