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;