summaryrefslogtreecommitdiffstats
path: root/src/fw-iso.c
diff options
context:
space:
mode:
authorGravatar Clemens Ladisch 2011-02-24 17:34:10 +0100
committerGravatar Stefan Richter 2011-02-25 19:45:49 +0100
commit793b7639cfebc23b1e97bdec5946138e4c73bda2 (patch)
tree2193ac7743157684a72c1ce88351e8dc89e8f858 /src/fw-iso.c
parentdo not delay iso packet queueing (diff)
fix start_on_cycle on firewire-core
Libraw1394 uses raw1394's convention of cycle numbers always being less than one second, i.e., in the range 0..7999. Firewire-core uses raw cycle numbers as used by the hardware, i.e., with several additional bits for the seconds. This was correctly handled when presenting timestamps returned by the kernel to the application, but the application's start_on_cycle value was passed directly to the kernel. To fix this, do the same calculations that ohci1394 did internally, i.e., interpret the start_on_cycle value as relative to the current seconds value of the cycle timer. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'src/fw-iso.c')
-rw-r--r--src/fw-iso.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/fw-iso.c b/src/fw-iso.c
index ce1a891..d44a945 100644
--- a/src/fw-iso.c
+++ b/src/fw-iso.c
@@ -21,6 +21,34 @@
#include "fw.h"
#include "raw1394_private.h"
+static int calculate_start_cycle(fw_handle_t handle)
+{
+ int cycle;
+ u_int32_t cycle_timer;
+ u_int64_t local_time;
+
+ cycle = handle->iso.start_on_cycle;
+ if (cycle < 0)
+ return cycle;
+
+ /* libraw1394's cycle is always mod 8000 */
+ cycle &= 0x1fff;
+
+ /* get the seconds from the current value of the cycle timer */
+ if (fw_read_cycle_timer(handle, &cycle_timer, &local_time) != 0)
+ return cycle;
+ cycle += (cycle_timer & 0xfe000000) >> 12;
+
+ /*
+ * For compatibility with raw1394, add one second
+ * "to give some extra time for DMA to start".
+ * TODO: are there still races due to cycle rollover?
+ */
+ cycle += 1 << 13;
+
+ return cycle & 0x7fff;
+}
+
static int
queue_packet(fw_handle_t handle,
unsigned int length, unsigned int header_length,
@@ -140,7 +168,7 @@ int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle,
if (fwhandle->iso.prebuffer <= fwhandle->iso.packet_count) {
start_iso.sync = 0; /* unused */
start_iso.tags = 0; /* unused */
- start_iso.cycle = start_on_cycle;
+ start_iso.cycle = calculate_start_cycle(fwhandle);
start_iso.handle = fwhandle->iso.kernel_handle;
retval = ioctl(fwhandle->iso.fd,
@@ -258,7 +286,8 @@ int fw_iso_recv_start(fw_handle_t handle, int start_on_cycle,
queue_recv_packets(handle);
- start_iso.cycle = start_on_cycle;
+ handle->iso.start_on_cycle = start_on_cycle;
+ start_iso.cycle = calculate_start_cycle(handle);
start_iso.tags =
tag_mask == -1 ? FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS : tag_mask;
/* sync is documented as 'not used' */
@@ -353,7 +382,7 @@ int fw_iso_xmit_write(raw1394handle_t handle, unsigned char *data,
fwhandle->iso.packet_count >= fwhandle->iso.prebuffer) {
/* Set this to 0 to indicate that we're running. */
fwhandle->iso.prebuffer = 0;
- start_iso.cycle = fwhandle->iso.start_on_cycle;
+ start_iso.cycle = calculate_start_cycle(fwhandle);
start_iso.handle = fwhandle->iso.kernel_handle;
retval = ioctl(fwhandle->iso.fd,
span>Added ieee1394.h header.Gravatar aeb 3-1/+38 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@40 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-13Fix raw1394_start_iso_write() which uses wrong variable.Gravatar aeb 1-1/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@39 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-10Work around compiler warnings for int/ptr casts.Gravatar aeb 6-10/+20 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@38 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-10Added control files for Debian packages.Gravatar aeb 6-8/+106 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@37 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-01Added missing prototypes for iso send functions.Gravatar aeb 1-0/+7 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@36 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-08-08Added raw1394_get_irm_id().Gravatar aeb 7-7/+39 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@35 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-08-06Added support for isochronous sending.Gravatar aeb 3-0/+35 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@34 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-07-05Added raw1394_reset_bus() call.Gravatar aeb 4-0/+23 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@33 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-22- Set library version info in configure.in, use in src/Makefile.am.Gravatar aeb 4-2/+16 - Enable compiler warnings. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@32 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-15Update libtool version number.Gravatar aeb 2-2/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@31 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-14Added copyright headers.Gravatar aeb 6-0/+54 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@30 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-11Added explicit AC_PROG_INSTALL call.Gravatar aeb 1-0/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@29 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-09Fix size of error field.Gravatar aeb 1-2/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@28 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-02Modified support for 32/64 bit environments, control struct fields have ↵Gravatar aeb 7-43/+28 fixed size now. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@27 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-05-28Added support for environments with 64 bit kernel and 32 bit userland.Gravatar aeb 8-7/+45 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@26 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-27Fixed missing setting of ext code in raw1394_start_lock()Gravatar aeb 1-0/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@25 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-15Fixed lock transaction to actually return response value.Gravatar aeb 3-5/+11 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@24 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-12Add userdata functions as news.Gravatar aeb 1-0/+4 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@23 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-05Add userdata functions.Gravatar aeb 3-0/+18 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@22 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Bump version number to 0.6.Gravatar aeb 3-5/+6 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@21 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Mention byte order change.Gravatar aeb 1-0/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@20 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Mention SourceForge home.Gravatar aeb 1-1/+5 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@19 53a565d1-3bb7-0310-b661-cf11e63c67ab