Handle rawiso dispositions.
This commit is contained in:
parent
7e50d28e8a
commit
18c6919398
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include "juju.h"
|
#include "juju.h"
|
||||||
|
|
||||||
static int
|
static enum raw1394_iso_disposition
|
||||||
queue_xmit_packets(raw1394handle_t handle)
|
queue_xmit_packets(raw1394handle_t handle)
|
||||||
{
|
{
|
||||||
struct fw_cdev_iso_packet *p = handle->iso.packets;
|
struct fw_cdev_iso_packet *p = handle->iso.packets;
|
||||||
|
@ -53,7 +53,8 @@ queue_xmit_packets(raw1394handle_t handle)
|
||||||
|
|
||||||
d = handle->iso.xmit_handler(handle, handle->iso.head,
|
d = handle->iso.xmit_handler(handle, handle->iso.head,
|
||||||
&len, &tag, &sy, cycle, dropped);
|
&len, &tag, &sy, cycle, dropped);
|
||||||
/* FIXME: handle the different dispositions. */
|
if (d != RAW1394_ISO_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
p->payload_length = len;
|
p->payload_length = len;
|
||||||
p->interrupt =
|
p->interrupt =
|
||||||
|
@ -77,14 +78,15 @@ queue_xmit_packets(raw1394handle_t handle)
|
||||||
|
|
||||||
len = ioctl(handle->iso.fd, FW_CDEV_IOC_QUEUE_ISO, &queue_iso);
|
len = ioctl(handle->iso.fd, FW_CDEV_IOC_QUEUE_ISO, &queue_iso);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return -1;
|
return RAW1394_ISO_ERROR;
|
||||||
|
|
||||||
return 0;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
flush_xmit_packets(raw1394handle_t handle, int limit)
|
flush_xmit_packets(raw1394handle_t handle, int limit)
|
||||||
{
|
{
|
||||||
|
enum raw1394_iso_disposition d;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (handle->iso.xmit_handler == NULL)
|
if (handle->iso.xmit_handler == NULL)
|
||||||
|
@ -93,8 +95,19 @@ flush_xmit_packets(raw1394handle_t handle, int limit)
|
||||||
if (limit < handle->iso.irq_interval)
|
if (limit < handle->iso.irq_interval)
|
||||||
limit = handle->iso.irq_interval;
|
limit = handle->iso.irq_interval;
|
||||||
|
|
||||||
while (handle->iso.packet_count + handle->iso.irq_interval <= limit)
|
while (handle->iso.packet_count + handle->iso.irq_interval <= limit) {
|
||||||
queue_xmit_packets(handle);
|
d = queue_xmit_packets(handle);
|
||||||
|
switch (d) {
|
||||||
|
case RAW1394_ISO_DEFER:
|
||||||
|
case RAW1394_ISO_AGAIN:
|
||||||
|
return 0;
|
||||||
|
case RAW1394_ISO_ERROR:
|
||||||
|
return -1;
|
||||||
|
case RAW1394_ISO_STOP:
|
||||||
|
raw1394_iso_stop(handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -168,7 +181,7 @@ queue_recv_packets(raw1394handle_t handle)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static enum raw1394_iso_disposition
|
||||||
flush_recv_packets(raw1394handle_t handle,
|
flush_recv_packets(raw1394handle_t handle,
|
||||||
struct fw_cdev_event_iso_interrupt *interrupt)
|
struct fw_cdev_event_iso_interrupt *interrupt)
|
||||||
{
|
{
|
||||||
|
@ -192,6 +205,10 @@ flush_recv_packets(raw1394handle_t handle,
|
||||||
|
|
||||||
d = handle->iso.recv_handler(handle, handle->iso.tail, len,
|
d = handle->iso.recv_handler(handle, handle->iso.tail, len,
|
||||||
channel, tag, sy, cycle, dropped);
|
channel, tag, sy, cycle, dropped);
|
||||||
|
if (d != RAW1394_ISO_OK)
|
||||||
|
/* FIXME: we need to save the headers so we
|
||||||
|
* can restart this loop. */
|
||||||
|
break;
|
||||||
cycle++;
|
cycle++;
|
||||||
|
|
||||||
handle->iso.tail += handle->iso.max_packet_size;
|
handle->iso.tail += handle->iso.max_packet_size;
|
||||||
|
@ -200,6 +217,19 @@ flush_recv_packets(raw1394handle_t handle,
|
||||||
handle->iso.tail = handle->iso.buffer;
|
handle->iso.tail = handle->iso.buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (d) {
|
||||||
|
case RAW1394_ISO_OK:
|
||||||
|
case RAW1394_ISO_DEFER:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RAW1394_ISO_ERROR:
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case RAW1394_ISO_STOP:
|
||||||
|
raw1394_iso_stop(handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
while (handle->iso.packet_count + handle->iso.irq_interval <=
|
while (handle->iso.packet_count + handle->iso.irq_interval <=
|
||||||
handle->iso.buf_packets)
|
handle->iso.buf_packets)
|
||||||
queue_recv_packets(handle);
|
queue_recv_packets(handle);
|
||||||
|
|
Reference in New Issue