aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-03-31 19:45:39 -0400
committerKristian Høgsberg <krh@redhat.com>2007-03-31 19:45:39 -0400
commit89281b576730c5f440bbd539e3efb5d5ab1036bc (patch)
tree04e681d45af466031df81be5670d61d4bb8c10c4
parent429167e36a4ebb994c838eaf44b7cfb7571cdf4b (diff)
downloadlibraw1394-89281b576730c5f440bbd539e3efb5d5ab1036bc.tar.gz
Decode iso headers properly.
-rw-r--r--juju/raw1394-iso.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/juju/raw1394-iso.c b/juju/raw1394-iso.c
index 893d36a..b65faf7 100644
--- a/juju/raw1394-iso.c
+++ b/juju/raw1394-iso.c
@@ -177,20 +177,19 @@ flush_recv_packets(raw1394handle_t handle,
end = (void *) interrupt->header + interrupt->header_length;
cycle = interrupt->cycle;
dropped = 0;
-
- /* FIXME: compute real buffer index. */
data = handle->iso.buffer +
handle->iso.packet_tail * handle->iso.max_packet_size;
while (p < end) {
header = be32_to_cpu(*p++);
- len = header >> 8;
- channel = header >> 8;
- tag = header >> 8;
- sy = header >> 8;
+ len = header >> 16;
+ tag = (header >> 14) & 0x3;
+ channel = (header >> 8) & 0x3f;
+ sy = header & 0x0f;
- printf("len=%d, channel=%d, tag=%d, sy=%d\n",
- len, channel, tag, sy);
+ fprintf(stderr,
+ "header: %08x, len=%d, channel=%d, tag=%d, sy=%d, packet_tail=0x%x\n",
+ header, len, channel, tag, sy, handle->iso.packet_tail);
d = handle->iso.recv_handler(handle, data, len, channel,
tag, sy, cycle, dropped);
@@ -199,6 +198,10 @@ flush_recv_packets(raw1394handle_t handle,
cycle++;
}
+ handle->iso.packet_tail += interrupt->header_length / 4;
+ if (handle->iso.packet_tail >= handle->iso.buf_packets)
+ handle->iso.packet_tail -= handle->iso.buf_packets;
+
queue_recv_packets(handle);
return 0;