diff options
author | Kristian Høgsberg <krh@redhat.com> | 2007-04-10 18:11:16 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-04-11 18:18:57 -0400 |
commit | 15536221d1f09ae7707f70a183045ee20d8bcf17 (patch) | |
tree | 1a2c4977632fee2464ebf63b95c14b74a4d16306 | |
parent | 8a2f7d932fc6a4881ff837738e23b41a1c228338 (diff) |
firewire: Byteswap iso header so all headers are presented as be32.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r-- | drivers/firewire/fw-ohci.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index b941239671d6..2229ea0b630e 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
@@ -1257,7 +1257,13 @@ static int handle_ir_dualbuffer_packet(struct context *context, | |||
1257 | p = db + 1; | 1257 | p = db + 1; |
1258 | end = p + header_length; | 1258 | end = p + header_length; |
1259 | while (p < end && i + ctx->base.header_size <= PAGE_SIZE) { | 1259 | while (p < end && i + ctx->base.header_size <= PAGE_SIZE) { |
1260 | memcpy(ctx->header + i, p + 4, ctx->base.header_size); | 1260 | /* The iso header is byteswapped to little endian by |
1261 | * the controller, but the remaining header quadlets | ||
1262 | * are big endian. We want to present all the headers | ||
1263 | * as big endian, so we have to swap the first | ||
1264 | * quadlet. */ | ||
1265 | *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4)); | ||
1266 | memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4); | ||
1261 | i += ctx->base.header_size; | 1267 | i += ctx->base.header_size; |
1262 | p += ctx->base.header_size + 4; | 1268 | p += ctx->base.header_size + 4; |
1263 | } | 1269 | } |