[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux1394-devel
Subject:    [PATCH 4/7] firewire: ohci: simplify iso header pointer arithmetic
From:       Clemens Ladisch <clemens () ladisch ! de>
Date:       2012-03-18 18:04:05
Message-ID: 4F662395.6040104 () ladisch ! de
[Download RAW message or body]

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>
---
 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 54e8e8e..612312d 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -2731,24 +2731,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;
 }

@@ -2867,8 +2869,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)
@@ -2879,10 +2881,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;

------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
mailing list linux1394-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux1394-devel
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic