- Plug firewire handle leakepel9
parent
59659a8e6c
commit
618497f20f
@ -1,298 +0,0 @@
|
|||||||
From: Erik Hovland <erik@hovland.org>
|
|
||||||
|
|
||||||
Series of coverity prevent-inspired fixes.
|
|
||||||
|
|
||||||
--
|
|
||||||
Makes extra sure strings are not overrun.
|
|
||||||
|
|
||||||
When using strncpy with the exact size of the destination string the
|
|
||||||
string may end up lacking null termination because the source string is
|
|
||||||
bigger then the destination.
|
|
||||||
|
|
||||||
--
|
|
||||||
Makes sure to check any return values
|
|
||||||
|
|
||||||
The return value of any function should be checked if that function
|
|
||||||
uses the return value to provide some sort of status information.
|
|
||||||
|
|
||||||
--
|
|
||||||
Makes sure a value is returned by the function.
|
|
||||||
|
|
||||||
A function can compile without returning something always.
|
|
||||||
|
|
||||||
--
|
|
||||||
Make sure that we have the right types.
|
|
||||||
|
|
||||||
When an unsigned type is assigned a signed value, the
|
|
||||||
negatived value is never seen.
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
Compare unsigned values instead of subtracting them.
|
|
||||||
|
|
||||||
Unsigned values do not return signed values when subtracted
|
|
||||||
and the right operand is larger then the left operand.
|
|
||||||
|
|
||||||
--
|
|
||||||
Protect against resource leaks.
|
|
||||||
|
|
||||||
--
|
|
||||||
Make sure variables are initialized before used.
|
|
||||||
|
|
||||||
|
|
||||||
Signed-off-by: Erik Hovland <erik@hovland.org>
|
|
||||||
---
|
|
||||||
|
|
||||||
src/dispatch.c | 11 ++++++++---
|
|
||||||
src/fw-iso.c | 11 +++++++----
|
|
||||||
src/fw.c | 49 +++++++++++++++++++++++++++++--------------------
|
|
||||||
tools/testlibraw.c | 3 ++-
|
|
||||||
4 files changed, 46 insertions(+), 28 deletions(-)
|
|
||||||
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/src/dispatch.c libraw1394-2.0.0/src/dispatch.c
|
|
||||||
--- libraw1394-2.0.0.orig/src/dispatch.c 2008-07-06 14:48:17.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0/src/dispatch.c 2008-10-01 10:58:16.000000000 -0400
|
|
||||||
@@ -48,7 +48,10 @@ raw1394handle_t raw1394_new_handle(void)
|
|
||||||
else if (handle) {
|
|
||||||
handle->is_fw = 1;
|
|
||||||
handle->mode.fw = fw_handle;
|
|
||||||
- }
|
|
||||||
+ } else if (fw_handle)
|
|
||||||
+ fw_destroy_handle(fw_handle);
|
|
||||||
+ else if (ieee1394_handle)
|
|
||||||
+ ieee1394_destroy_handle(ieee1394_handle);
|
|
||||||
}
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
@@ -75,14 +78,16 @@ raw1394handle_t raw1394_new_handle_on_po
|
|
||||||
if (handle) {
|
|
||||||
handle->is_fw = 0;
|
|
||||||
handle->mode.ieee1394 = ieee1394_handle;
|
|
||||||
- }
|
|
||||||
+ } else
|
|
||||||
+ ieee1394_destroy_handle(ieee1394_handle);
|
|
||||||
}
|
|
||||||
else if (fw_handle = fw_new_handle_on_port(port)) {
|
|
||||||
handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
|
||||||
if (handle) {
|
|
||||||
handle->is_fw = 1;
|
|
||||||
handle->mode.fw = fw_handle;
|
|
||||||
- }
|
|
||||||
+ } else
|
|
||||||
+ fw_destroy_handle(fw_handle);
|
|
||||||
}
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/src/fw.c libraw1394-2.0.0/src/fw.c
|
|
||||||
--- libraw1394-2.0.0.orig/src/fw.c 2008-07-05 16:09:29.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0/src/fw.c 2008-10-01 10:58:16.000000000 -0400
|
|
||||||
@@ -125,7 +125,7 @@ scan_devices(fw_handle_t handle)
|
|
||||||
char filename[32];
|
|
||||||
struct fw_cdev_get_info get_info;
|
|
||||||
struct fw_cdev_event_bus_reset reset;
|
|
||||||
- int fd, err, i;
|
|
||||||
+ int fd, err, i, fname_str_sz;
|
|
||||||
struct port *ports;
|
|
||||||
|
|
||||||
ports = handle->ports;
|
|
||||||
@@ -162,8 +162,9 @@ scan_devices(fw_handle_t handle)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (i < MAX_PORTS && reset.node_id == reset.local_node_id) {
|
|
||||||
- strncpy(ports[i].device_file, filename,
|
|
||||||
- sizeof ports[i].device_file);
|
|
||||||
+ fname_str_sz = sizeof(ports[i].device_file) - 1;
|
|
||||||
+ strncpy(ports[i].device_file, filename, fname_str_sz);
|
|
||||||
+ ports[i].device_file[fname_str_sz] = '\0';
|
|
||||||
ports[i].node_count = (reset.root_node_id & 0x3f) + 1;
|
|
||||||
ports[i].card = get_info.card;
|
|
||||||
i++;
|
|
||||||
@@ -315,7 +316,7 @@ handle_inotify(raw1394handle_t handle, s
|
|
||||||
struct fw_cdev_get_info info;
|
|
||||||
struct fw_cdev_event_bus_reset reset;
|
|
||||||
struct epoll_event ep;
|
|
||||||
- int i, len, fd, phy_id;
|
|
||||||
+ int i, len, fd, phy_id, fname_str_sz;
|
|
||||||
|
|
||||||
event = (struct inotify_event *) fwhandle->buffer;
|
|
||||||
len = read(fwhandle->inotify_fd, event, BUFFER_SIZE);
|
|
||||||
@@ -365,8 +366,9 @@ handle_inotify(raw1394handle_t handle, s
|
|
||||||
fwhandle->devices[i].node_id = reset.node_id;
|
|
||||||
fwhandle->devices[i].generation = reset.generation;
|
|
||||||
fwhandle->devices[i].fd = fd;
|
|
||||||
- strncpy(fwhandle->devices[i].filename, filename,
|
|
||||||
- sizeof fwhandle->devices[i].filename);
|
|
||||||
+ fname_str_sz = sizeof(fwhandle->devices[i].filename) - 1;
|
|
||||||
+ strncpy(fwhandle->devices[i].filename, filename, fname_str_sz);
|
|
||||||
+ fwhandle->devices[i].filename[fname_str_sz] = '\0';
|
|
||||||
fwhandle->devices[i].closure.func = handle_device_event;
|
|
||||||
ep.events = EPOLLIN;
|
|
||||||
ep.data.ptr = &fwhandle->devices[i].closure;
|
|
||||||
@@ -501,8 +503,10 @@ fw_handle_t fw_new_handle_on_port(int po
|
|
||||||
if (handle == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
- if (fw_set_port(handle, port) < 0)
|
|
||||||
+ if (fw_set_port(handle, port) < 0) {
|
|
||||||
+ fw_destroy_handle(handle);
|
|
||||||
return NULL;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
@@ -538,15 +542,17 @@ int fw_get_port_info(fw_handle_t handle,
|
|
||||||
struct raw1394_portinfo *pinf,
|
|
||||||
int maxports)
|
|
||||||
{
|
|
||||||
- int i;
|
|
||||||
+ int i, port_name_sz;
|
|
||||||
|
|
||||||
if (maxports >= handle->port_count)
|
|
||||||
maxports = handle->port_count;
|
|
||||||
|
|
||||||
for (i = 0; i < maxports; i++) {
|
|
||||||
pinf[i].nodes = handle->ports[i].node_count;
|
|
||||||
+ port_name_sz = sizeof(pinf[i].name) - 1;
|
|
||||||
strncpy(pinf[i].name, handle->ports[i].device_file,
|
|
||||||
- sizeof pinf[i].name);
|
|
||||||
+ port_name_sz);
|
|
||||||
+ pinf[i].name[port_name_sz] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return handle->port_count;
|
|
||||||
@@ -560,7 +566,7 @@ int fw_set_port(fw_handle_t handle, int
|
|
||||||
struct dirent *de;
|
|
||||||
char filename[32];
|
|
||||||
DIR *dir;
|
|
||||||
- int i, fd, phy_id;
|
|
||||||
+ int i, fd, phy_id, fname_str_sz;
|
|
||||||
|
|
||||||
if (port >= handle->port_count) {
|
|
||||||
errno = EINVAL;
|
|
||||||
@@ -606,8 +612,9 @@ int fw_set_port(fw_handle_t handle, int
|
|
||||||
handle->devices[i].node_id = reset.node_id;
|
|
||||||
handle->devices[i].generation = reset.generation;
|
|
||||||
handle->devices[i].fd = fd;
|
|
||||||
- strncpy(handle->devices[i].filename, filename,
|
|
||||||
- sizeof handle->devices[i].filename);
|
|
||||||
+ fname_str_sz = sizeof(handle->devices[i].filename) -1;
|
|
||||||
+ strncpy(handle->devices[i].filename, filename, fname_str_sz);
|
|
||||||
+ handle->devices[i].filename[fname_str_sz] = '\0';
|
|
||||||
|
|
||||||
handle->devices[i].closure.func = handle_device_event;
|
|
||||||
memset(&ep, 0, sizeof(ep));
|
|
||||||
@@ -623,8 +630,9 @@ int fw_set_port(fw_handle_t handle, int
|
|
||||||
if (reset.node_id == reset.local_node_id) {
|
|
||||||
memcpy(&handle->reset, &reset, sizeof handle->reset);
|
|
||||||
handle->local_fd = fd;
|
|
||||||
- strncpy(handle->local_filename, filename,
|
|
||||||
- sizeof handle->local_filename);
|
|
||||||
+ fname_str_sz = sizeof(handle->local_filename) -1;
|
|
||||||
+ strncpy(handle->local_filename, filename, fname_str_sz);
|
|
||||||
+ handle->local_filename[fname_str_sz] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
@@ -1174,14 +1182,14 @@ fw_lock(raw1394handle_t handle, nodeid_t
|
|
||||||
quadlet_t *result)
|
|
||||||
{
|
|
||||||
quadlet_t buffer[2];
|
|
||||||
- size_t length;
|
|
||||||
+ ssize_t length;
|
|
||||||
|
|
||||||
length = setup_lock(extcode, data, arg, buffer);
|
|
||||||
if (length < 0)
|
|
||||||
return length;
|
|
||||||
|
|
||||||
return send_request_sync(handle, 16 + extcode, node, addr,
|
|
||||||
- length, buffer, result);
|
|
||||||
+ (size_t) length, buffer, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
@@ -1190,14 +1198,14 @@ fw_lock64(raw1394handle_t handle, nodeid
|
|
||||||
octlet_t *result)
|
|
||||||
{
|
|
||||||
octlet_t buffer[2];
|
|
||||||
- size_t length;
|
|
||||||
+ ssize_t length;
|
|
||||||
|
|
||||||
length = setup_lock64(extcode, data, arg, buffer);
|
|
||||||
if (length < 0)
|
|
||||||
return length;
|
|
||||||
|
|
||||||
return send_request_sync(handle, 16 + extcode, node, addr,
|
|
||||||
- length, buffer, result);
|
|
||||||
+ (size_t) length, buffer, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
@@ -1308,9 +1316,10 @@ fw_bandwidth_modify (raw1394handle_t han
|
|
||||||
compare = ntohl (buffer);
|
|
||||||
switch (mode) {
|
|
||||||
case RAW1394_MODIFY_ALLOC:
|
|
||||||
- swap = compare - bandwidth;
|
|
||||||
- if (swap < 0)
|
|
||||||
+ if (compare < bandwidth)
|
|
||||||
return -1;
|
|
||||||
+
|
|
||||||
+ swap = compare - bandwidth;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RAW1394_MODIFY_FREE:
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/src/fw-iso.c libraw1394-2.0.0/src/fw-iso.c
|
|
||||||
--- libraw1394-2.0.0.orig/src/fw-iso.c 2008-07-05 16:16:30.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0/src/fw-iso.c 2008-10-01 10:58:40.000000000 -0400
|
|
||||||
@@ -76,6 +76,7 @@ queue_packet(fw_handle_t handle,
|
|
||||||
if (err < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
@@ -84,7 +85,8 @@ queue_xmit_packets(raw1394handle_t handl
|
|
||||||
fw_handle_t fwhandle = handle->mode.fw;
|
|
||||||
enum raw1394_iso_disposition d;
|
|
||||||
unsigned char tag, sy;
|
|
||||||
- int len, cycle, dropped;
|
|
||||||
+ int len, cycle = -1;
|
|
||||||
+ unsigned int dropped = 0;
|
|
||||||
|
|
||||||
if (fwhandle->iso.xmit_handler == NULL)
|
|
||||||
return 0;
|
|
||||||
@@ -259,6 +261,7 @@ int fw_iso_xmit_write(raw1394handle_t ha
|
|
||||||
struct fw_cdev_queue_iso queue_iso;
|
|
||||||
struct fw_cdev_start_iso start_iso;
|
|
||||||
struct fw_cdev_iso_packet *p;
|
|
||||||
+ int retval;
|
|
||||||
|
|
||||||
if (len > fwhandle->iso.max_packet_size) {
|
|
||||||
errno = EINVAL;
|
|
||||||
@@ -283,10 +286,10 @@ int fw_iso_xmit_write(raw1394handle_t ha
|
|
||||||
start_iso.cycle = fwhandle->iso.start_on_cycle;
|
|
||||||
start_iso.handle = 0;
|
|
||||||
|
|
||||||
- len = ioctl(fwhandle->iso.fd,
|
|
||||||
+ retval = ioctl(fwhandle->iso.fd,
|
|
||||||
FW_CDEV_IOC_START_ISO, &start_iso);
|
|
||||||
- if (len < 0)
|
|
||||||
- return len;
|
|
||||||
+ if (retval < 0)
|
|
||||||
+ return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/tools/testlibraw.c libraw1394-2.0.0/tools/testlibraw.c
|
|
||||||
--- libraw1394-2.0.0.orig/tools/testlibraw.c 2008-07-05 16:09:29.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0/tools/testlibraw.c 2008-10-01 10:58:02.000000000 -0400
|
|
||||||
@@ -180,7 +180,8 @@ int main(int argc, char **argv)
|
|
||||||
perror("failed");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
- raw1394_loop_iterate(handle);
|
|
||||||
+ if (raw1394_loop_iterate(handle))
|
|
||||||
+ perror("failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\nusing standard tag handler and synchronous calls\n");
|
|
@ -1,96 +0,0 @@
|
|||||||
diff -Naurp libraw1394-2.0.0.orig/src/dispatch.c libraw1394-2.0.0.fix/src/dispatch.c
|
|
||||||
--- libraw1394-2.0.0.orig/src/dispatch.c 2008-12-05 11:37:36.686557198 -0500
|
|
||||||
+++ libraw1394-2.0.0.fix/src/dispatch.c 2008-12-05 11:38:57.117432534 -0500
|
|
||||||
@@ -553,10 +553,7 @@ int raw1394_channel_modify (raw1394handl
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
- if (handle->is_fw)
|
|
||||||
- return fw_channel_modify(handle, channel, mode);
|
|
||||||
- else
|
|
||||||
- return ieee1394_channel_modify(handle, channel, mode);
|
|
||||||
+ return ieee1394_channel_modify(handle, channel, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
int raw1394_iso_xmit_init(raw1394handle_t handle,
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/src/fw.c libraw1394-2.0.0.fix/src/fw.c
|
|
||||||
--- libraw1394-2.0.0.orig/src/fw.c 2008-12-05 11:37:36.689432892 -0500
|
|
||||||
+++ libraw1394-2.0.0.fix/src/fw.c 2008-12-05 11:39:44.830509943 -0500
|
|
||||||
@@ -1342,52 +1342,3 @@ fw_bandwidth_modify (raw1394handle_t han
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
-int
|
|
||||||
-fw_channel_modify (raw1394handle_t handle,
|
|
||||||
- unsigned int channel,
|
|
||||||
- enum raw1394_modify_mode mode)
|
|
||||||
-{
|
|
||||||
- quadlet_t buffer, compare, swap, bit;
|
|
||||||
- nodeaddr_t addr;
|
|
||||||
- int result;
|
|
||||||
-
|
|
||||||
- if (channel >= 64)
|
|
||||||
- return -1;
|
|
||||||
- addr = CSR_REGISTER_BASE +
|
|
||||||
- CSR_CHANNELS_AVAILABLE_HI + 4 * (channel / 32);
|
|
||||||
- /* Read currently available channels from IRM. */
|
|
||||||
- result = raw1394_read(handle, raw1394_get_irm_id (handle), addr,
|
|
||||||
- sizeof buffer, &buffer);
|
|
||||||
- if (result < 0)
|
|
||||||
- return -1;
|
|
||||||
-
|
|
||||||
- /* IEEE numbers bits from MSB (0) to LSB (31). */
|
|
||||||
- bit = 1 << (31 - (channel & 31));
|
|
||||||
- compare = ntohl(buffer);
|
|
||||||
- switch (mode) {
|
|
||||||
- case RAW1394_MODIFY_ALLOC:
|
|
||||||
- if ((compare & bit) == 0)
|
|
||||||
- return -1;
|
|
||||||
- swap = buffer & ~bit;
|
|
||||||
- break;
|
|
||||||
-
|
|
||||||
- case RAW1394_MODIFY_FREE:
|
|
||||||
- if ((buffer & bit) != 0)
|
|
||||||
- return -1;
|
|
||||||
- swap = buffer | bit;
|
|
||||||
- break;
|
|
||||||
-
|
|
||||||
- default:
|
|
||||||
- return -1;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- result = raw1394_lock (handle, raw1394_get_irm_id (handle), addr,
|
|
||||||
- RAW1394_EXTCODE_COMPARE_SWAP,
|
|
||||||
- htonl(swap), htonl(compare), &buffer);
|
|
||||||
-
|
|
||||||
- if (result < 0 || ntohl(buffer) != compare)
|
|
||||||
- return -1;
|
|
||||||
-
|
|
||||||
- return 0;
|
|
||||||
-}
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/src/fw.h libraw1394-2.0.0.fix/src/fw.h
|
|
||||||
--- libraw1394-2.0.0.orig/src/fw.h 2008-07-05 16:16:30.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0.fix/src/fw.h 2008-12-05 11:40:02.062495475 -0500
|
|
||||||
@@ -214,9 +214,6 @@ int fw_get_config_rom(fw_handle_t handle
|
|
||||||
int fw_bandwidth_modify (raw1394handle_t handle,
|
|
||||||
unsigned int bandwidth,
|
|
||||||
enum raw1394_modify_mode mode);
|
|
||||||
-int fw_channel_modify (raw1394handle_t handle,
|
|
||||||
- unsigned int channel,
|
|
||||||
- enum raw1394_modify_mode mode);
|
|
||||||
|
|
||||||
int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle,
|
|
||||||
int prebuffer_packets);
|
|
||||||
diff -Naurp libraw1394-2.0.0.orig/src/raw1394.h libraw1394-2.0.0.fix/src/raw1394.h
|
|
||||||
--- libraw1394-2.0.0.orig/src/raw1394.h 2008-07-06 15:03:31.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0.fix/src/raw1394.h 2008-12-05 11:39:23.582432381 -0500
|
|
||||||
@@ -1203,7 +1203,7 @@ raw1394_bandwidth_modify (raw1394handle_
|
|
||||||
enum raw1394_modify_mode mode);
|
|
||||||
|
|
||||||
/**
|
|
||||||
- * raw1394_bandwidth_modify - allocate or release isochronous channel
|
|
||||||
+ * raw1394_channel_modify - allocate or release isochronous channel
|
|
||||||
* @handle: a libraw1394 handle
|
|
||||||
* @channel: isochronous channel
|
|
||||||
* @mode: whether to allocate or free
|
|
@ -1,200 +0,0 @@
|
|||||||
diff -Naurp libraw1394-2.0.0/src/arm.c libraw1394-2.0.0.fix/src/arm.c
|
|
||||||
--- libraw1394-2.0.0/src/arm.c 2008-07-05 16:08:26.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0.fix/src/arm.c 2008-11-20 12:37:05.136821199 -0500
|
|
||||||
@@ -109,7 +109,6 @@ int ieee1394_arm_set_buf (struct ieee139
|
|
||||||
size_t length, void *buf)
|
|
||||||
{
|
|
||||||
struct raw1394_request req;
|
|
||||||
- int status;
|
|
||||||
|
|
||||||
CLEAR_REQ(&req);
|
|
||||||
|
|
||||||
@@ -139,7 +138,6 @@ int ieee1394_arm_get_buf (struct ieee139
|
|
||||||
size_t length, void *buf)
|
|
||||||
{
|
|
||||||
struct raw1394_request req;
|
|
||||||
- int status;
|
|
||||||
|
|
||||||
CLEAR_REQ(&req);
|
|
||||||
|
|
||||||
diff -Naurp libraw1394-2.0.0/src/dispatch.c libraw1394-2.0.0.fix/src/dispatch.c
|
|
||||||
--- libraw1394-2.0.0/src/dispatch.c 2008-11-20 12:36:00.918753368 -0500
|
|
||||||
+++ libraw1394-2.0.0.fix/src/dispatch.c 2008-11-20 12:42:03.387817813 -0500
|
|
||||||
@@ -24,36 +24,35 @@ int raw1394_errcode_to_errno(raw1394_err
|
|
||||||
|
|
||||||
raw1394handle_t raw1394_new_handle(void)
|
|
||||||
{
|
|
||||||
- ieee1394handle_t ieee1394_handle = ieee1394_new_handle();
|
|
||||||
- fw_handle_t fw_handle = NULL;
|
|
||||||
- raw1394handle_t handle = NULL;
|
|
||||||
-
|
|
||||||
- if (ieee1394_handle) {
|
|
||||||
- struct raw1394_portinfo port;
|
|
||||||
- if (ieee1394_get_port_info(ieee1394_handle, &port, 1) < 1) {
|
|
||||||
- ieee1394_destroy_handle(ieee1394_handle);
|
|
||||||
- ieee1394_handle = NULL;
|
|
||||||
- fw_handle = fw_new_handle();
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
- else {
|
|
||||||
- fw_handle = fw_new_handle();
|
|
||||||
- }
|
|
||||||
- if (ieee1394_handle || fw_handle) {
|
|
||||||
- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
|
||||||
- if (ieee1394_handle && handle) {
|
|
||||||
- handle->is_fw = 0;
|
|
||||||
- handle->mode.ieee1394 = ieee1394_handle;
|
|
||||||
- }
|
|
||||||
- else if (handle) {
|
|
||||||
- handle->is_fw = 1;
|
|
||||||
- handle->mode.fw = fw_handle;
|
|
||||||
- } else if (fw_handle)
|
|
||||||
- fw_destroy_handle(fw_handle);
|
|
||||||
- else if (ieee1394_handle)
|
|
||||||
- ieee1394_destroy_handle(ieee1394_handle);
|
|
||||||
+ ieee1394handle_t ieee1394_handle;
|
|
||||||
+ fw_handle_t fw_handle;
|
|
||||||
+ raw1394handle_t handle;
|
|
||||||
+ struct raw1394_portinfo port;
|
|
||||||
+
|
|
||||||
+ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
|
||||||
+ if (!handle)
|
|
||||||
+ return NULL;
|
|
||||||
+
|
|
||||||
+ ieee1394_handle = ieee1394_new_handle();
|
|
||||||
+ if (!ieee1394_handle)
|
|
||||||
+ goto try_fw;
|
|
||||||
+
|
|
||||||
+ if (ieee1394_get_port_info(ieee1394_handle, &port, 1) >= 1) {
|
|
||||||
+ handle->is_fw = 0;
|
|
||||||
+ handle->mode.ieee1394 = ieee1394_handle;
|
|
||||||
+ return handle;
|
|
||||||
+ }
|
|
||||||
+ ieee1394_destroy_handle(ieee1394_handle);
|
|
||||||
+try_fw:
|
|
||||||
+ fw_handle = fw_new_handle();
|
|
||||||
+ if (fw_handle) {
|
|
||||||
+ handle->is_fw = 1;
|
|
||||||
+ handle->mode.fw = fw_handle;
|
|
||||||
+ return handle;
|
|
||||||
}
|
|
||||||
- return handle;
|
|
||||||
+
|
|
||||||
+ free(handle);
|
|
||||||
+ return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void raw1394_destroy_handle(raw1394handle_t handle)
|
|
||||||
@@ -69,27 +68,30 @@ void raw1394_destroy_handle(raw1394handl
|
|
||||||
|
|
||||||
raw1394handle_t raw1394_new_handle_on_port(int port)
|
|
||||||
{
|
|
||||||
- ieee1394handle_t ieee1394_handle = ieee1394_new_handle_on_port(port);
|
|
||||||
- fw_handle_t fw_handle = NULL;
|
|
||||||
- raw1394handle_t handle = NULL;
|
|
||||||
+ ieee1394handle_t ieee1394_handle;
|
|
||||||
+ fw_handle_t fw_handle;
|
|
||||||
+ raw1394handle_t handle;
|
|
||||||
+
|
|
||||||
+ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
|
||||||
+ if (!handle)
|
|
||||||
+ return NULL;
|
|
||||||
|
|
||||||
+ ieee1394_handle = ieee1394_new_handle_on_port(port);
|
|
||||||
if (ieee1394_handle) {
|
|
||||||
- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
|
||||||
- if (handle) {
|
|
||||||
- handle->is_fw = 0;
|
|
||||||
- handle->mode.ieee1394 = ieee1394_handle;
|
|
||||||
- } else
|
|
||||||
- ieee1394_destroy_handle(ieee1394_handle);
|
|
||||||
- }
|
|
||||||
- else if (fw_handle = fw_new_handle_on_port(port)) {
|
|
||||||
- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
|
||||||
- if (handle) {
|
|
||||||
- handle->is_fw = 1;
|
|
||||||
- handle->mode.fw = fw_handle;
|
|
||||||
- } else
|
|
||||||
- fw_destroy_handle(fw_handle);
|
|
||||||
+ handle->is_fw = 0;
|
|
||||||
+ handle->mode.ieee1394 = ieee1394_handle;
|
|
||||||
+ return handle;
|
|
||||||
}
|
|
||||||
- return handle;
|
|
||||||
+
|
|
||||||
+ fw_handle = fw_new_handle_on_port(port);
|
|
||||||
+ if (fw_handle) {
|
|
||||||
+ handle->is_fw = 1;
|
|
||||||
+ handle->mode.fw = fw_handle;
|
|
||||||
+ return handle;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ free(handle);
|
|
||||||
+ return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int raw1394_busreset_notify (raw1394handle_t handle, int off_on_switch)
|
|
||||||
diff -Naurp libraw1394-2.0.0/src/eventloop.c libraw1394-2.0.0.fix/src/eventloop.c
|
|
||||||
--- libraw1394-2.0.0/src/eventloop.c 2008-07-06 14:41:48.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0.fix/src/eventloop.c 2008-11-20 12:38:22.289816445 -0500
|
|
||||||
@@ -32,7 +32,7 @@ int ieee1394_loop_iterate(struct raw1394
|
|
||||||
{
|
|
||||||
struct raw1394_request req;
|
|
||||||
ieee1394handle_t ihandle = handle->mode.ieee1394;
|
|
||||||
- int retval = 0, channel;
|
|
||||||
+ int retval = 0;
|
|
||||||
|
|
||||||
while (read(ihandle->fd, &req, sizeof(req)) < 0) {
|
|
||||||
if (errno != EINTR) return -1;
|
|
||||||
diff -Naurp libraw1394-2.0.0/src/fw.c libraw1394-2.0.0.fix/src/fw.c
|
|
||||||
--- libraw1394-2.0.0/src/fw.c 2008-11-20 12:36:00.920753360 -0500
|
|
||||||
+++ libraw1394-2.0.0.fix/src/fw.c 2008-11-20 12:43:13.017816248 -0500
|
|
||||||
@@ -773,10 +773,12 @@ handle_arm_request(raw1394handle_t handl
|
|
||||||
}
|
|
||||||
rrb->request.generation = fwhandle->reset.generation;
|
|
||||||
rrb->request.buffer_length = in_length;
|
|
||||||
+ rrb->request.buffer = rrb->data;
|
|
||||||
memcpy(rrb->request.buffer, request->data, in_length);
|
|
||||||
|
|
||||||
rrb->response.response_code = response.rcode;
|
|
||||||
rrb->response.buffer_length = response.length;
|
|
||||||
+ rrb->request.buffer = rrb->data + in_length;
|
|
||||||
memcpy(rrb->response.buffer,
|
|
||||||
allocation->data + offset, response.length);
|
|
||||||
|
|
||||||
diff -Naurp libraw1394-2.0.0/src/fw-iso.c libraw1394-2.0.0.fix/src/fw-iso.c
|
|
||||||
--- libraw1394-2.0.0/src/fw-iso.c 2008-11-20 12:36:00.921763895 -0500
|
|
||||||
+++ libraw1394-2.0.0.fix/src/fw-iso.c 2008-11-20 12:39:35.003793770 -0500
|
|
||||||
@@ -85,7 +85,8 @@ queue_xmit_packets(raw1394handle_t handl
|
|
||||||
fw_handle_t fwhandle = handle->mode.fw;
|
|
||||||
enum raw1394_iso_disposition d;
|
|
||||||
unsigned char tag, sy;
|
|
||||||
- int len, cycle = -1;
|
|
||||||
+ unsigned int len;
|
|
||||||
+ int cycle = -1;
|
|
||||||
unsigned int dropped = 0;
|
|
||||||
|
|
||||||
if (fwhandle->iso.xmit_handler == NULL)
|
|
||||||
@@ -258,9 +259,7 @@ int fw_iso_xmit_write(raw1394handle_t ha
|
|
||||||
unsigned char sy)
|
|
||||||
{
|
|
||||||
fw_handle_t fwhandle = handle->mode.fw;
|
|
||||||
- struct fw_cdev_queue_iso queue_iso;
|
|
||||||
struct fw_cdev_start_iso start_iso;
|
|
||||||
- struct fw_cdev_iso_packet *p;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
if (len > fwhandle->iso.max_packet_size) {
|
|
||||||
diff -Naurp libraw1394-2.0.0/src/main.c libraw1394-2.0.0.fix/src/main.c
|
|
||||||
--- libraw1394-2.0.0/src/main.c 2008-07-06 14:50:34.000000000 -0400
|
|
||||||
+++ libraw1394-2.0.0.fix/src/main.c 2008-11-20 12:40:02.828816470 -0500
|
|
||||||
@@ -253,9 +253,7 @@ void *raw1394_get_userdata(struct raw139
|
|
||||||
int ieee1394_get_port_info(struct ieee1394_handle *handle,
|
|
||||||
struct raw1394_portinfo *pinf, int maxports)
|
|
||||||
{
|
|
||||||
- int num;
|
|
||||||
struct raw1394_request req;
|
|
||||||
- struct raw1394_khost_list *khl;
|
|
||||||
|
|
||||||
CLEAR_REQ(&req);
|
|
||||||
req.type = RAW1394_REQ_LIST_CARDS;
|
|
@ -0,0 +1,993 @@
|
|||||||
|
Makefile.am | 23 ----
|
||||||
|
src/arm.c | 2 -
|
||||||
|
src/dispatch.c | 102 ++++++++++---------
|
||||||
|
src/eventloop.c | 2 +-
|
||||||
|
src/fw-iso.c | 40 ++++++--
|
||||||
|
src/fw.c | 143 +++++---------------------
|
||||||
|
src/fw.h | 7 +-
|
||||||
|
src/main.c | 2 -
|
||||||
|
src/raw1394.h | 2 +-
|
||||||
|
tools/testlibraw.c | 285 ++++++++++++++++++++++++++++++----------------------
|
||||||
|
10 files changed, 279 insertions(+), 329 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile.am b/Makefile.am
|
||||||
|
index f48af74..bf094f0 100644
|
||||||
|
--- a/Makefile.am
|
||||||
|
+++ b/Makefile.am
|
||||||
|
@@ -23,28 +23,5 @@ htmldoc:
|
||||||
|
|
||||||
|
.PHONY: doc psdoc pdfdoc htmldoc
|
||||||
|
|
||||||
|
-# make required device file
|
||||||
|
-dev:
|
||||||
|
- mknod -m 600 /dev/raw1394 c 171 0
|
||||||
|
- chown root.root /dev/raw1394
|
||||||
|
- @echo
|
||||||
|
- @echo "/dev/raw1394 created"
|
||||||
|
- @echo "It is owned by root with permissions 600. You may want to fix"
|
||||||
|
- @echo "the group/permission to something appropriate for you."
|
||||||
|
- @echo "Note however that anyone who can open raw1394 can access all"
|
||||||
|
- @echo "devices on all connected 1394 buses unrestricted, including"
|
||||||
|
- @echo "harddisks and other probably sensitive devices."
|
||||||
|
- @echo
|
||||||
|
-
|
||||||
|
-install-exec-hook:
|
||||||
|
- @if [ ! -c /dev/raw1394 ]; then \
|
||||||
|
- echo; \
|
||||||
|
- echo "********************************************"; \
|
||||||
|
- echo "Required /dev/raw1394 device file not found."; \
|
||||||
|
- echo "Run 'make dev' to create it."; \
|
||||||
|
- echo "********************************************"; \
|
||||||
|
- echo; \
|
||||||
|
- fi
|
||||||
|
-
|
||||||
|
dist-hook:
|
||||||
|
git log >$(distdir)/ChangeLog
|
||||||
|
diff --git a/src/arm.c b/src/arm.c
|
||||||
|
index c523c00..27ad762 100644
|
||||||
|
--- a/src/arm.c
|
||||||
|
+++ b/src/arm.c
|
||||||
|
@@ -109,7 +109,6 @@ int ieee1394_arm_set_buf (struct ieee1394_handle *handle, nodeaddr_t start,
|
||||||
|
size_t length, void *buf)
|
||||||
|
{
|
||||||
|
struct raw1394_request req;
|
||||||
|
- int status;
|
||||||
|
|
||||||
|
CLEAR_REQ(&req);
|
||||||
|
|
||||||
|
@@ -139,7 +138,6 @@ int ieee1394_arm_get_buf (struct ieee1394_handle *handle, nodeaddr_t start,
|
||||||
|
size_t length, void *buf)
|
||||||
|
{
|
||||||
|
struct raw1394_request req;
|
||||||
|
- int status;
|
||||||
|
|
||||||
|
CLEAR_REQ(&req);
|
||||||
|
|
||||||
|
diff --git a/src/dispatch.c b/src/dispatch.c
|
||||||
|
index b15e8c5..49ceca2 100644
|
||||||
|
--- a/src/dispatch.c
|
||||||
|
+++ b/src/dispatch.c
|
||||||
|
@@ -24,33 +24,35 @@ int raw1394_errcode_to_errno(raw1394_errcode_t errcode)
|
||||||
|
|
||||||
|
raw1394handle_t raw1394_new_handle(void)
|
||||||
|
{
|
||||||
|
- ieee1394handle_t ieee1394_handle = ieee1394_new_handle();
|
||||||
|
- fw_handle_t fw_handle = NULL;
|
||||||
|
- raw1394handle_t handle = NULL;
|
||||||
|
+ ieee1394handle_t ieee1394_handle;
|
||||||
|
+ fw_handle_t fw_handle;
|
||||||
|
+ raw1394handle_t handle;
|
||||||
|
+ struct raw1394_portinfo port;
|
||||||
|
|
||||||
|
- if (ieee1394_handle) {
|
||||||
|
- struct raw1394_portinfo port;
|
||||||
|
- if (ieee1394_get_port_info(ieee1394_handle, &port, 1) < 1) {
|
||||||
|
- ieee1394_destroy_handle(ieee1394_handle);
|
||||||
|
- ieee1394_handle = NULL;
|
||||||
|
- fw_handle = fw_new_handle();
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- fw_handle = fw_new_handle();
|
||||||
|
- }
|
||||||
|
- if (ieee1394_handle || fw_handle) {
|
||||||
|
- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
||||||
|
- if (ieee1394_handle && handle) {
|
||||||
|
- handle->is_fw = 0;
|
||||||
|
- handle->mode.ieee1394 = ieee1394_handle;
|
||||||
|
- }
|
||||||
|
- else if (handle) {
|
||||||
|
- handle->is_fw = 1;
|
||||||
|
- handle->mode.fw = fw_handle;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return handle;
|
||||||
|
+ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
||||||
|
+ if (!handle)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ ieee1394_handle = ieee1394_new_handle();
|
||||||
|
+ if (!ieee1394_handle)
|
||||||
|
+ goto try_fw;
|
||||||
|
+
|
||||||
|
+ if (ieee1394_get_port_info(ieee1394_handle, &port, 1) >= 1) {
|
||||||
|
+ handle->is_fw = 0;
|
||||||
|
+ handle->mode.ieee1394 = ieee1394_handle;
|
||||||
|
+ return handle;
|
||||||
|
+ }
|
||||||
|
+ ieee1394_destroy_handle(ieee1394_handle);
|
||||||
|
+try_fw:
|
||||||
|
+ fw_handle = fw_new_handle();
|
||||||
|
+ if (fw_handle) {
|
||||||
|
+ handle->is_fw = 1;
|
||||||
|
+ handle->mode.fw = fw_handle;
|
||||||
|
+ return handle;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ free(handle);
|
||||||
|
+ return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void raw1394_destroy_handle(raw1394handle_t handle)
|
||||||
|
@@ -61,30 +63,36 @@ void raw1394_destroy_handle(raw1394handle_t handle)
|
||||||
|
if (handle->is_fw)
|
||||||
|
fw_destroy_handle(handle->mode.fw);
|
||||||
|
else
|
||||||
|
- ieee1394_destroy_handle(handle->mode.ieee1394);;
|
||||||
|
+ ieee1394_destroy_handle(handle->mode.ieee1394);
|
||||||
|
+ free(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
raw1394handle_t raw1394_new_handle_on_port(int port)
|
||||||
|
{
|
||||||
|
- ieee1394handle_t ieee1394_handle = ieee1394_new_handle_on_port(port);
|
||||||
|
- fw_handle_t fw_handle = NULL;
|
||||||
|
- raw1394handle_t handle = NULL;
|
||||||
|
+ ieee1394handle_t ieee1394_handle;
|
||||||
|
+ fw_handle_t fw_handle;
|
||||||
|
+ raw1394handle_t handle;
|
||||||
|
+
|
||||||
|
+ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
||||||
|
+ if (!handle)
|
||||||
|
+ return NULL;
|
||||||
|
|
||||||
|
+ ieee1394_handle = ieee1394_new_handle_on_port(port);
|
||||||
|
if (ieee1394_handle) {
|
||||||
|
- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
||||||
|
- if (handle) {
|
||||||
|
- handle->is_fw = 0;
|
||||||
|
- handle->mode.ieee1394 = ieee1394_handle;
|
||||||
|
- }
|
||||||
|
+ handle->is_fw = 0;
|
||||||
|
+ handle->mode.ieee1394 = ieee1394_handle;
|
||||||
|
+ return handle;
|
||||||
|
}
|
||||||
|
- else if (fw_handle = fw_new_handle_on_port(port)) {
|
||||||
|
- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle));
|
||||||
|
- if (handle) {
|
||||||
|
- handle->is_fw = 1;
|
||||||
|
- handle->mode.fw = fw_handle;
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
+ fw_handle = fw_new_handle_on_port(port);
|
||||||
|
+ if (fw_handle) {
|
||||||
|
+ handle->is_fw = 1;
|
||||||
|
+ handle->mode.fw = fw_handle;
|
||||||
|
+ return handle;
|
||||||
|
}
|
||||||
|
- return handle;
|
||||||
|
+
|
||||||
|
+ free(handle);
|
||||||
|
+ return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int raw1394_busreset_notify (raw1394handle_t handle, int off_on_switch)
|
||||||
|
@@ -533,10 +541,7 @@ int raw1394_bandwidth_modify (raw1394handle_t handle, unsigned int bandwidth,
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
- if (handle->is_fw)
|
||||||
|
- return fw_bandwidth_modify(handle, bandwidth, mode);
|
||||||
|
- else
|
||||||
|
- return ieee1394_bandwidth_modify(handle, bandwidth, mode);
|
||||||
|
+ return ieee1394_bandwidth_modify(handle, bandwidth, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int raw1394_channel_modify (raw1394handle_t handle, unsigned int channel,
|
||||||
|
@@ -546,10 +551,7 @@ int raw1394_channel_modify (raw1394handle_t handle, unsigned int channel,
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
- if (handle->is_fw)
|
||||||
|
- return fw_channel_modify(handle, channel, mode);
|
||||||
|
- else
|
||||||
|
- return ieee1394_channel_modify(handle, channel, mode);
|
||||||
|
+ return ieee1394_channel_modify(handle, channel, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int raw1394_iso_xmit_init(raw1394handle_t handle,
|
||||||
|
diff --git a/src/eventloop.c b/src/eventloop.c
|
||||||
|
index 43a9519..81bb881 100644
|
||||||
|
--- a/src/eventloop.c
|
||||||
|
+++ b/src/eventloop.c
|
||||||
|
@@ -32,7 +32,7 @@ int ieee1394_loop_iterate(struct raw1394_handle *handle)
|
||||||
|
{
|
||||||
|
struct raw1394_request req;
|
||||||
|
ieee1394handle_t ihandle = handle->mode.ieee1394;
|
||||||
|
- int retval = 0, channel;
|
||||||
|
+ int retval = 0;
|
||||||
|
|
||||||
|
while (read(ihandle->fd, &req, sizeof(req)) < 0) {
|
||||||
|
if (errno != EINTR) return -1;
|
||||||
|
diff --git a/src/fw-iso.c b/src/fw-iso.c
|
||||||
|
index f493444..6a84662 100644
|
||||||
|
--- a/src/fw-iso.c
|
||||||
|
+++ b/src/fw-iso.c
|
||||||
|
@@ -1,6 +1,6 @@
|
||||||
|
/* -*- c-basic-offset: 8 -*-
|
||||||
|
*
|
||||||
|
- * raw1394-iso.c -- Emulation of the raw1394 rawiso API on the firewire stack
|
||||||
|
+ * fw-iso.c -- Emulation of the raw1394 rawiso API on the firewire stack
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Kristian Hoegsberg <krh@bitplanet.net>
|
||||||
|
*
|
||||||
|
@@ -76,6 +76,7 @@ queue_packet(fw_handle_t handle,
|
||||||
|
if (err < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -84,7 +85,9 @@ queue_xmit_packets(raw1394handle_t handle, int limit)
|
||||||
|
fw_handle_t fwhandle = handle->mode.fw;
|
||||||
|
enum raw1394_iso_disposition d;
|
||||||
|
unsigned char tag, sy;
|
||||||
|
- int len, cycle, dropped;
|
||||||
|
+ unsigned int len;
|
||||||
|
+ int cycle = -1;
|
||||||
|
+ unsigned int dropped = 0;
|
||||||
|
|
||||||
|
if (fwhandle->iso.xmit_handler == NULL)
|
||||||
|
return 0;
|
||||||
|
@@ -138,7 +141,14 @@ int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle,
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return queue_xmit_packets(handle, fwhandle->iso.buf_packets);
|
||||||
|
+ retval = queue_xmit_packets(handle, fwhandle->iso.buf_packets);
|
||||||
|
+
|
||||||
|
+ if (retval)
|
||||||
|
+ return -1;
|
||||||
|
+ else
|
||||||
|
+ fwhandle->iso.state = ISO_ACTIVE;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -221,7 +231,12 @@ int fw_iso_recv_start(fw_handle_t handle, int start_on_cycle,
|
||||||
|
start_iso.sync = 0;
|
||||||
|
start_iso.handle = 0;
|
||||||
|
|
||||||
|
- return ioctl(handle->iso.fd, FW_CDEV_IOC_START_ISO, &start_iso);
|
||||||
|
+ if (ioctl(handle->iso.fd, FW_CDEV_IOC_START_ISO, &start_iso))
|
||||||
|
+ return -1;
|
||||||
|
+ else
|
||||||
|
+ handle->iso.state = ISO_ACTIVE;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handle_iso_event(raw1394handle_t handle,
|
||||||
|
@@ -256,9 +271,8 @@ int fw_iso_xmit_write(raw1394handle_t handle, unsigned char *data,
|
||||||
|
unsigned char sy)
|
||||||
|
{
|
||||||
|
fw_handle_t fwhandle = handle->mode.fw;
|
||||||
|
- struct fw_cdev_queue_iso queue_iso;
|
||||||
|
struct fw_cdev_start_iso start_iso;
|
||||||
|
- struct fw_cdev_iso_packet *p;
|
||||||
|
+ int retval;
|
||||||
|
|
||||||
|
if (len > fwhandle->iso.max_packet_size) {
|
||||||
|
errno = EINVAL;
|
||||||
|
@@ -283,10 +297,10 @@ int fw_iso_xmit_write(raw1394handle_t handle, unsigned char *data,
|
||||||
|
start_iso.cycle = fwhandle->iso.start_on_cycle;
|
||||||
|
start_iso.handle = 0;
|
||||||
|
|
||||||
|
- len = ioctl(fwhandle->iso.fd,
|
||||||
|
+ retval = ioctl(fwhandle->iso.fd,
|
||||||
|
FW_CDEV_IOC_START_ISO, &start_iso);
|
||||||
|
- if (len < 0)
|
||||||
|
- return len;
|
||||||
|
+ if (retval < 0)
|
||||||
|
+ return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -443,6 +457,7 @@ iso_init(fw_handle_t handle, int type,
|
||||||
|
handle->iso.head = handle->iso.buffer;
|
||||||
|
handle->iso.tail = handle->iso.buffer;
|
||||||
|
handle->iso.first_payload = handle->iso.buffer;
|
||||||
|
+ handle->iso.state = ISO_STOPPED;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -519,15 +534,20 @@ void fw_iso_stop(fw_handle_t handle)
|
||||||
|
handle->iso.first_payload = handle->iso.buffer;
|
||||||
|
handle->iso.packet_phase = 0;
|
||||||
|
handle->iso.packet_count = 0;
|
||||||
|
+ handle->iso.packet_index = 0;
|
||||||
|
+ handle->iso.state = ISO_STOPPED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fw_iso_shutdown(fw_handle_t handle)
|
||||||
|
{
|
||||||
|
munmap(handle->iso.buffer,
|
||||||
|
handle->iso.buf_packets * handle->iso.max_packet_size);
|
||||||
|
+ if (handle->iso.state != ISO_STOPPED)
|
||||||
|
+ fw_iso_stop(handle);
|
||||||
|
close(handle->iso.fd);
|
||||||
|
free(handle->iso.packets);
|
||||||
|
handle->iso.packets = NULL;
|
||||||
|
+ handle->iso.fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fw_read_cycle_timer(fw_handle_t handle,
|
||||||
|
@@ -537,7 +557,7 @@ int fw_read_cycle_timer(fw_handle_t handle,
|
||||||
|
int err;
|
||||||
|
struct fw_cdev_get_cycle_timer ctr = { 0 };
|
||||||
|
|
||||||
|
- err = ioctl(handle->iso.fd, FW_CDEV_IOC_GET_CYCLE_TIMER, &ctr);
|
||||||
|
+ err = ioctl(handle->local_fd, FW_CDEV_IOC_GET_CYCLE_TIMER, &ctr);
|
||||||
|
if (!err) {
|
||||||
|
*cycle_timer = ctr.cycle_timer;
|
||||||
|
*local_time = ctr.local_time;
|
||||||
|
diff --git a/src/fw.c b/src/fw.c
|
||||||
|
index 3c61385..03e34a7 100644
|
||||||
|
--- a/src/fw.c
|
||||||
|
+++ b/src/fw.c
|
||||||
|
@@ -125,7 +125,7 @@ scan_devices(fw_handle_t handle)
|
||||||
|
char filename[32];
|
||||||
|
struct fw_cdev_get_info get_info;
|
||||||
|
struct fw_cdev_event_bus_reset reset;
|
||||||
|
- int fd, err, i;
|
||||||
|
+ int fd, err, i, fname_str_sz;
|
||||||
|
struct port *ports;
|
||||||
|
|
||||||
|
ports = handle->ports;
|
||||||
|
@@ -162,8 +162,9 @@ scan_devices(fw_handle_t handle)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (i < MAX_PORTS && reset.node_id == reset.local_node_id) {
|
||||||
|
- strncpy(ports[i].device_file, filename,
|
||||||
|
- sizeof ports[i].device_file);
|
||||||
|
+ fname_str_sz = sizeof(ports[i].device_file) - 1;
|
||||||
|
+ strncpy(ports[i].device_file, filename, fname_str_sz);
|
||||||
|
+ ports[i].device_file[fname_str_sz] = '\0';
|
||||||
|
ports[i].node_count = (reset.root_node_id & 0x3f) + 1;
|
||||||
|
ports[i].card = get_info.card;
|
||||||
|
i++;
|
||||||
|
@@ -315,7 +316,7 @@ handle_inotify(raw1394handle_t handle, struct epoll_closure *ec,
|
||||||
|
struct fw_cdev_get_info info;
|
||||||
|
struct fw_cdev_event_bus_reset reset;
|
||||||
|
struct epoll_event ep;
|
||||||
|
- int i, len, fd, phy_id;
|
||||||
|
+ int i, len, fd, phy_id, fname_str_sz;
|
||||||
|
|
||||||
|
event = (struct inotify_event *) fwhandle->buffer;
|
||||||
|
len = read(fwhandle->inotify_fd, event, BUFFER_SIZE);
|
||||||
|
@@ -365,8 +366,9 @@ handle_inotify(raw1394handle_t handle, struct epoll_closure *ec,
|
||||||
|
fwhandle->devices[i].node_id = reset.node_id;
|
||||||
|
fwhandle->devices[i].generation = reset.generation;
|
||||||
|
fwhandle->devices[i].fd = fd;
|
||||||
|
- strncpy(fwhandle->devices[i].filename, filename,
|
||||||
|
- sizeof fwhandle->devices[i].filename);
|
||||||
|
+ fname_str_sz = sizeof(fwhandle->devices[i].filename) - 1;
|
||||||
|
+ strncpy(fwhandle->devices[i].filename, filename, fname_str_sz);
|
||||||
|
+ fwhandle->devices[i].filename[fname_str_sz] = '\0';
|
||||||
|
fwhandle->devices[i].closure.func = handle_device_event;
|
||||||
|
ep.events = EPOLLIN;
|
||||||
|
ep.data.ptr = &fwhandle->devices[i].closure;
|
||||||
|
@@ -501,8 +503,10 @@ fw_handle_t fw_new_handle_on_port(int port)
|
||||||
|
if (handle == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if (fw_set_port(handle, port) < 0)
|
||||||
|
+ if (fw_set_port(handle, port) < 0) {
|
||||||
|
+ fw_destroy_handle(handle);
|
||||||
|
return NULL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
@@ -538,15 +542,17 @@ int fw_get_port_info(fw_handle_t handle,
|
||||||
|
struct raw1394_portinfo *pinf,
|
||||||
|
int maxports)
|
||||||
|
{
|
||||||
|
- int i;
|
||||||
|
+ int i, port_name_sz;
|
||||||
|
|
||||||
|
if (maxports >= handle->port_count)
|
||||||
|
maxports = handle->port_count;
|
||||||
|
|
||||||
|
for (i = 0; i < maxports; i++) {
|
||||||
|
pinf[i].nodes = handle->ports[i].node_count;
|
||||||
|
+ port_name_sz = sizeof(pinf[i].name) - 1;
|
||||||
|
strncpy(pinf[i].name, handle->ports[i].device_file,
|
||||||
|
- sizeof pinf[i].name);
|
||||||
|
+ port_name_sz);
|
||||||
|
+ pinf[i].name[port_name_sz] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return handle->port_count;
|
||||||
|
@@ -560,7 +566,7 @@ int fw_set_port(fw_handle_t handle, int port)
|
||||||
|
struct dirent *de;
|
||||||
|
char filename[32];
|
||||||
|
DIR *dir;
|
||||||
|
- int i, fd, phy_id;
|
||||||
|
+ int i, fd, phy_id, fname_str_sz;
|
||||||
|
|
||||||
|
if (port >= handle->port_count) {
|
||||||
|
errno = EINVAL;
|
||||||
|
@@ -606,8 +612,9 @@ int fw_set_port(fw_handle_t handle, int port)
|
||||||
|
handle->devices[i].node_id = reset.node_id;
|
||||||
|
handle->devices[i].generation = reset.generation;
|
||||||
|
handle->devices[i].fd = fd;
|
||||||
|
- strncpy(handle->devices[i].filename, filename,
|
||||||
|
- sizeof handle->devices[i].filename);
|
||||||
|
+ fname_str_sz = sizeof(handle->devices[i].filename) -1;
|
||||||
|
+ strncpy(handle->devices[i].filename, filename, fname_str_sz);
|
||||||
|
+ handle->devices[i].filename[fname_str_sz] = '\0';
|
||||||
|
|
||||||
|
handle->devices[i].closure.func = handle_device_event;
|
||||||
|
memset(&ep, 0, sizeof(ep));
|
||||||
|
@@ -623,8 +630,9 @@ int fw_set_port(fw_handle_t handle, int port)
|
||||||
|
if (reset.node_id == reset.local_node_id) {
|
||||||
|
memcpy(&handle->reset, &reset, sizeof handle->reset);
|
||||||
|
handle->local_fd = fd;
|
||||||
|
- strncpy(handle->local_filename, filename,
|
||||||
|
- sizeof handle->local_filename);
|
||||||
|
+ fname_str_sz = sizeof(handle->local_filename) -1;
|
||||||
|
+ strncpy(handle->local_filename, filename, fname_str_sz);
|
||||||
|
+ handle->local_filename[fname_str_sz] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
@@ -765,10 +773,12 @@ handle_arm_request(raw1394handle_t handle, struct address_closure *ac,
|
||||||
|
}
|
||||||
|
rrb->request.generation = fwhandle->reset.generation;
|
||||||
|
rrb->request.buffer_length = in_length;
|
||||||
|
+ rrb->request.buffer = rrb->data;
|
||||||
|
memcpy(rrb->request.buffer, request->data, in_length);
|
||||||
|
|
||||||
|
rrb->response.response_code = response.rcode;
|
||||||
|
rrb->response.buffer_length = response.length;
|
||||||
|
+ rrb->response.buffer = rrb->data + in_length;
|
||||||
|
memcpy(rrb->response.buffer,
|
||||||
|
allocation->data + offset, response.length);
|
||||||
|
|
||||||
|
@@ -1174,14 +1184,14 @@ fw_lock(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
|
||||||
|
quadlet_t *result)
|
||||||
|
{
|
||||||
|
quadlet_t buffer[2];
|
||||||
|
- size_t length;
|
||||||
|
+ ssize_t length;
|
||||||
|
|
||||||
|
length = setup_lock(extcode, data, arg, buffer);
|
||||||
|
if (length < 0)
|
||||||
|
return length;
|
||||||
|
|
||||||
|
return send_request_sync(handle, 16 + extcode, node, addr,
|
||||||
|
- length, buffer, result);
|
||||||
|
+ (size_t) length, buffer, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1190,14 +1200,14 @@ fw_lock64(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
|
||||||
|
octlet_t *result)
|
||||||
|
{
|
||||||
|
octlet_t buffer[2];
|
||||||
|
- size_t length;
|
||||||
|
+ ssize_t length;
|
||||||
|
|
||||||
|
length = setup_lock64(extcode, data, arg, buffer);
|
||||||
|
if (length < 0)
|
||||||
|
return length;
|
||||||
|
|
||||||
|
return send_request_sync(handle, 16 + extcode, node, addr,
|
||||||
|
- length, buffer, result);
|
||||||
|
+ (size_t) length, buffer, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1283,100 +1293,3 @@ fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer,
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
-#define MAXIMUM_BANDWIDTH 4915
|
||||||
|
-
|
||||||
|
-int
|
||||||
|
-fw_bandwidth_modify (raw1394handle_t handle,
|
||||||
|
- unsigned int bandwidth,
|
||||||
|
- enum raw1394_modify_mode mode)
|
||||||
|
-{
|
||||||
|
- quadlet_t buffer, compare, swap;
|
||||||
|
- nodeaddr_t addr;
|
||||||
|
- int result;
|
||||||
|
-
|
||||||
|
- if (bandwidth == 0)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- addr = CSR_REGISTER_BASE + CSR_BANDWIDTH_AVAILABLE;
|
||||||
|
- /* Read current bandwidth usage from IRM. */
|
||||||
|
- result = raw1394_read (handle, raw1394_get_irm_id (handle), addr,
|
||||||
|
- sizeof buffer, &buffer);
|
||||||
|
- if (result < 0)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- compare = ntohl (buffer);
|
||||||
|
- switch (mode) {
|
||||||
|
- case RAW1394_MODIFY_ALLOC:
|
||||||
|
- swap = compare - bandwidth;
|
||||||
|
- if (swap < 0)
|
||||||
|
- return -1;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case RAW1394_MODIFY_FREE:
|
||||||
|
- swap = compare + bandwidth;
|
||||||
|
- if (swap > MAXIMUM_BANDWIDTH)
|
||||||
|
- swap = MAXIMUM_BANDWIDTH;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- default:
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- result = raw1394_lock(handle, raw1394_get_irm_id (handle), addr,
|
||||||
|
- RAW1394_EXTCODE_COMPARE_SWAP,
|
||||||
|
- htonl(swap), htonl(compare), &buffer);
|
||||||
|
- if (result < 0 || ntohl(buffer) != compare)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-int
|
||||||
|
-fw_channel_modify (raw1394handle_t handle,
|
||||||
|
- unsigned int channel,
|
||||||
|
- enum raw1394_modify_mode mode)
|
||||||
|
-{
|
||||||
|
- quadlet_t buffer, compare, swap, bit;
|
||||||
|
- nodeaddr_t addr;
|
||||||
|
- int result;
|
||||||
|
-
|
||||||
|
- if (channel >= 64)
|
||||||
|
- return -1;
|
||||||
|
- addr = CSR_REGISTER_BASE +
|
||||||
|
- CSR_CHANNELS_AVAILABLE_HI + 4 * (channel / 32);
|
||||||
|
- /* Read currently available channels from IRM. */
|
||||||
|
- result = raw1394_read(handle, raw1394_get_irm_id (handle), addr,
|
||||||
|
- sizeof buffer, &buffer);
|
||||||
|
- if (result < 0)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- /* IEEE numbers bits from MSB (0) to LSB (31). */
|
||||||
|
- bit = 1 << (31 - (channel & 31));
|
||||||
|
- compare = ntohl(buffer);
|
||||||
|
- switch (mode) {
|
||||||
|
- case RAW1394_MODIFY_ALLOC:
|
||||||
|
- if ((compare & bit) == 0)
|
||||||
|
- return -1;
|
||||||
|
- swap = buffer & ~bit;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case RAW1394_MODIFY_FREE:
|
||||||
|
- if ((buffer & bit) != 0)
|
||||||
|
- return -1;
|
||||||
|
- swap = buffer | bit;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- default:
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- result = raw1394_lock (handle, raw1394_get_irm_id (handle), addr,
|
||||||
|
- RAW1394_EXTCODE_COMPARE_SWAP,
|
||||||
|
- htonl(swap), htonl(compare), &buffer);
|
||||||
|
-
|
||||||
|
- if (result < 0 || ntohl(buffer) != compare)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
diff --git a/src/fw.h b/src/fw.h
|
||||||
|
index 4ee9017..56b59d9 100644
|
||||||
|
--- a/src/fw.h
|
||||||
|
+++ b/src/fw.h
|
||||||
|
@@ -129,6 +129,7 @@ struct fw_handle {
|
||||||
|
int prebuffer;
|
||||||
|
int start_on_cycle;
|
||||||
|
enum raw1394_iso_dma_recv_mode recv_mode;
|
||||||
|
+ enum { ISO_STOPPED, ISO_ACTIVE } state;
|
||||||
|
raw1394_iso_xmit_handler_t xmit_handler;
|
||||||
|
raw1394_iso_recv_handler_t recv_handler;
|
||||||
|
unsigned char *buffer, *buffer_end, *head;
|
||||||
|
@@ -211,12 +212,6 @@ int fw_update_config_rom(fw_handle_t handle, const quadlet_t *new_rom,
|
||||||
|
int fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer,
|
||||||
|
size_t buffersize, size_t *rom_size,
|
||||||
|
unsigned char *rom_version);
|
||||||
|
-int fw_bandwidth_modify (raw1394handle_t handle,
|
||||||
|
- unsigned int bandwidth,
|
||||||
|
- enum raw1394_modify_mode mode);
|
||||||
|
-int fw_channel_modify (raw1394handle_t handle,
|
||||||
|
- unsigned int channel,
|
||||||
|
- enum raw1394_modify_mode mode);
|
||||||
|
|
||||||
|
int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle,
|
||||||
|
int prebuffer_packets);
|
||||||
|
diff --git a/src/main.c b/src/main.c
|
||||||
|
index 55b4fbc..d83256e 100644
|
||||||
|
--- a/src/main.c
|
||||||
|
+++ b/src/main.c
|
||||||
|
@@ -253,9 +253,7 @@ void *raw1394_get_userdata(struct raw1394_handle *handle)
|
||||||
|
int ieee1394_get_port_info(struct ieee1394_handle *handle,
|
||||||
|
struct raw1394_portinfo *pinf, int maxports)
|
||||||
|
{
|
||||||
|
- int num;
|
||||||
|
struct raw1394_request req;
|
||||||
|
- struct raw1394_khost_list *khl;
|
||||||
|
|
||||||
|
CLEAR_REQ(&req);
|
||||||
|
req.type = RAW1394_REQ_LIST_CARDS;
|
||||||
|
diff --git a/src/raw1394.h b/src/raw1394.h
|
||||||
|
index c489c20..7bfeb05 100644
|
||||||
|
--- a/src/raw1394.h
|
||||||
|
+++ b/src/raw1394.h
|
||||||
|
@@ -1203,7 +1203,7 @@ raw1394_bandwidth_modify (raw1394handle_t handle, unsigned int bandwidth,
|
||||||
|
enum raw1394_modify_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * raw1394_bandwidth_modify - allocate or release isochronous channel
|
||||||
|
+ * raw1394_channel_modify - allocate or release isochronous channel
|
||||||
|
* @handle: a libraw1394 handle
|
||||||
|
* @channel: isochronous channel
|
||||||
|
* @mode: whether to allocate or free
|
||||||
|
diff --git a/tools/testlibraw.c b/tools/testlibraw.c
|
||||||
|
index efd87ad..82b8ee5 100644
|
||||||
|
--- a/tools/testlibraw.c
|
||||||
|
+++ b/tools/testlibraw.c
|
||||||
|
@@ -14,6 +14,7 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
+#include <time.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include "../src/raw1394.h"
|
||||||
|
@@ -53,8 +54,8 @@ static const unsigned char fcp_data[] =
|
||||||
|
int my_fcp_handler(raw1394handle_t handle, nodeid_t nodeid, int response,
|
||||||
|
size_t length, unsigned char *data)
|
||||||
|
{
|
||||||
|
- printf("got fcp %s from node %d of %d bytes:",
|
||||||
|
- (response ? "response" : "command"), nodeid & 0x3f, length);
|
||||||
|
+ printf(" got fcp %s from node %d of %d bytes:",
|
||||||
|
+ (response ? "response" : "command"), nodeid & 0x3f, length);
|
||||||
|
|
||||||
|
if (memcmp(fcp_data, data, sizeof fcp_data) != 0)
|
||||||
|
printf("ERROR: fcp payload not correct\n");
|
||||||
|
@@ -73,7 +74,7 @@ int my_fcp_handler(raw1394handle_t handle, nodeid_t nodeid, int response,
|
||||||
|
static void
|
||||||
|
test_fcp(raw1394handle_t handle)
|
||||||
|
{
|
||||||
|
- printf("\ntesting FCP monitoring on local node\n");
|
||||||
|
+ printf("\n - testing FCP monitoring on local node\n");
|
||||||
|
raw1394_set_fcp_handler(handle, my_fcp_handler);
|
||||||
|
raw1394_start_fcp_listen(handle);
|
||||||
|
raw1394_write(handle, raw1394_get_local_id(handle),
|
||||||
|
@@ -95,142 +96,188 @@ read_topology_map(raw1394handle_t handle)
|
||||||
|
|
||||||
|
retval = raw1394_read(handle, local_id,
|
||||||
|
CSR_REGISTER_BASE + CSR_TOPOLOGY_MAP, 12, &map[0]);
|
||||||
|
- if (retval < 0)
|
||||||
|
- perror("topology map: raw1394_read failed with error");
|
||||||
|
-
|
||||||
|
+ if (retval < 0) {
|
||||||
|
+ perror("\n - topology map: raw1394_read failed with error");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
self_id_count = ntohl(map[2]) & 0xffff;
|
||||||
|
node_count = ntohl(map[2]) >> 16;
|
||||||
|
retval = raw1394_read(handle, local_id,
|
||||||
|
CSR_REGISTER_BASE + CSR_TOPOLOGY_MAP + 12,
|
||||||
|
self_id_count * sizeof map[0], &map[3]);
|
||||||
|
- if (retval < 0)
|
||||||
|
- perror("topology map: raw1394_read failed with error");
|
||||||
|
+ if (retval < 0) {
|
||||||
|
+ perror("\n - topology map: raw1394_read failed with error");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- printf("topology map: %d nodes, %d self ids, generation %d\n",
|
||||||
|
+ printf("\n - topology map: %d nodes, %d self ids, generation %d\n",
|
||||||
|
node_count, self_id_count, ntohl(map[1]));
|
||||||
|
for (i = 0; i < self_id_count; i++)
|
||||||
|
- printf(" 0x%08x\n", ntohl(map[3 + i]));
|
||||||
|
+ printf(" 0x%08x\n", ntohl(map[3 + i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
-int main(int argc, char **argv)
|
||||||
|
+static void
|
||||||
|
+test_config_rom(raw1394handle_t handle)
|
||||||
|
{
|
||||||
|
- raw1394handle_t handle;
|
||||||
|
- int i, numcards;
|
||||||
|
- struct raw1394_portinfo pinf[16];
|
||||||
|
-
|
||||||
|
- tag_handler_t std_handler;
|
||||||
|
- int retval;
|
||||||
|
-
|
||||||
|
- struct pollfd pfd;
|
||||||
|
- quadlet_t rom[0x100];
|
||||||
|
- size_t rom_size;
|
||||||
|
- unsigned char rom_version;
|
||||||
|
-
|
||||||
|
- handle = raw1394_new_handle();
|
||||||
|
-
|
||||||
|
- if (!handle) {
|
||||||
|
- if (!errno) {
|
||||||
|
- printf(not_compatible);
|
||||||
|
- } else {
|
||||||
|
- perror("couldn't get handle");
|
||||||
|
- printf(not_loaded);
|
||||||
|
- }
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- printf("successfully got handle\n");
|
||||||
|
- printf("current generation number: %d\n", raw1394_get_generation(handle));
|
||||||
|
-
|
||||||
|
- numcards = raw1394_get_port_info(handle, pinf, 16);
|
||||||
|
- if (numcards < 0) {
|
||||||
|
- perror("couldn't get card info");
|
||||||
|
- exit(1);
|
||||||
|
- } else {
|
||||||
|
- printf("%d card(s) found\n", numcards);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (!numcards) {
|
||||||
|
- exit(0);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- for (i = 0; i < numcards; i++) {
|
||||||
|
- printf(" nodes on bus: %2d, card name: %s\n", pinf[i].nodes,
|
||||||
|
- pinf[i].name);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (raw1394_set_port(handle, 0) < 0) {
|
||||||
|
- perror("couldn't set port");
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
+ quadlet_t rom[0x100] = { 0, };
|
||||||
|
+ size_t rom_size;
|
||||||
|
+ unsigned char rom_version;
|
||||||
|
+ int i, retval;
|
||||||
|
+
|
||||||
|
+ printf("\n - testing config rom\n");
|
||||||
|
+ retval = raw1394_get_config_rom(handle, rom, 0x100,
|
||||||
|
+ &rom_size, &rom_version);
|
||||||
|
+ printf(" get_config_rom returned %d, romsize %d, rom_version %d\n",
|
||||||
|
+ retval, rom_size, rom_version);
|
||||||
|
+ printf(" here are the first 10 quadlets:\n");
|
||||||
|
+ for (i = 0; i < 10; i++)
|
||||||
|
+ printf(" 0x%08x\n", i, rom[i]);
|
||||||
|
+
|
||||||
|
+ retval = raw1394_update_config_rom(handle, rom, rom_size, rom_version);
|
||||||
|
+ printf(" update_config_rom returned %d\n", retval);
|
||||||
|
+}
|
||||||
|
|
||||||
|
- printf("using first card found: %d nodes on bus, local ID is %d, IRM is %d\n",
|
||||||
|
- raw1394_get_nodecount(handle),
|
||||||
|
- raw1394_get_local_id(handle) & 0x3f,
|
||||||
|
- raw1394_get_irm_id(handle) & 0x3f);
|
||||||
|
-
|
||||||
|
- printf("\ndoing transactions with custom tag handler\n");
|
||||||
|
- std_handler = raw1394_set_tag_handler(handle, my_tag_handler);
|
||||||
|
- for (i = 0; i < pinf[0].nodes; i++) {
|
||||||
|
- printf("trying to send read request to node %d... ", i);
|
||||||
|
- fflush(stdout);
|
||||||
|
- buffer = 0;
|
||||||
|
-
|
||||||
|
- if (raw1394_start_read(handle, 0xffc0 | i, TESTADDR, 4,
|
||||||
|
- &buffer, 0) < 0) {
|
||||||
|
- perror("failed");
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- raw1394_loop_iterate(handle);
|
||||||
|
- }
|
||||||
|
+static void
|
||||||
|
+read_cycle_timer(raw1394handle_t handle)
|
||||||
|
+{
|
||||||
|
+ u_int32_t ct;
|
||||||
|
+ u_int64_t local_time;
|
||||||
|
+ time_t seconds;
|
||||||
|
+ int retval;
|
||||||
|
+
|
||||||
|
+ retval = raw1394_read_cycle_timer(handle, &ct, &local_time);
|
||||||
|
+ if (retval < 0) {
|
||||||
|
+ perror("\n - raw1394_read_cycle_timer failed with error");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ printf("\n - cycle timer: %d seconds, %d cycles, %d sub-cycles\n",
|
||||||
|
+ ct >> 25, (ct >> 12) & 0x1fff, ct & 0xfff);
|
||||||
|
+ seconds = local_time / 1000000;
|
||||||
|
+ printf(" local time: %lld us = %s",
|
||||||
|
+ (unsigned long long)local_time, ctime(&seconds));
|
||||||
|
+}
|
||||||
|
|
||||||
|
- printf("\nusing standard tag handler and synchronous calls\n");
|
||||||
|
- raw1394_set_tag_handler(handle, std_handler);
|
||||||
|
- for (i = 0; i < pinf[0].nodes; i++) {
|
||||||
|
- printf("trying to read from node %d... ", i);
|
||||||
|
- fflush(stdout);
|
||||||
|
- buffer = 0;
|
||||||
|
-
|
||||||
|
- retval = raw1394_read(handle, 0xffc0 | i, TESTADDR, 4, &buffer);
|
||||||
|
- if (retval < 0) {
|
||||||
|
- perror("failed with error");
|
||||||
|
- } else {
|
||||||
|
- printf("completed with value 0x%08x\n", buffer);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+int test_card(int card)
|
||||||
|
+{
|
||||||
|
+ raw1394handle_t handle;
|
||||||
|
+ struct raw1394_portinfo pinf;
|
||||||
|
+ tag_handler_t std_handler;
|
||||||
|
+ struct pollfd pfd;
|
||||||
|
+ int i, n, numcards, retval;
|
||||||
|
+
|
||||||
|
+ handle = raw1394_new_handle();
|
||||||
|
+
|
||||||
|
+ if (!handle) {
|
||||||
|
+ if (!errno) {
|
||||||
|
+ printf(not_compatible);
|
||||||
|
+ } else {
|
||||||
|
+ perror("couldn't get handle");
|
||||||
|
+ printf(not_loaded);
|
||||||
|
+ }
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (card == 0) {
|
||||||
|
+ printf("successfully got handle\n");
|
||||||
|
+ printf("current generation number: %d\n",
|
||||||
|
+ raw1394_get_generation(handle));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ numcards = raw1394_get_port_info(handle, &pinf, 1);
|
||||||
|
+ if (numcards < card)
|
||||||
|
+ perror("couldn't get card info");
|
||||||
|
+ else if (card == 0)
|
||||||
|
+ printf("%d card%s found\n",
|
||||||
|
+ numcards, numcards == 1 ? "" : "s");
|
||||||
|
+
|
||||||
|
+ if (numcards <= card)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ printf("\ncard %d, name: %s\n", card, pinf.name);
|
||||||
|
+
|
||||||
|
+ if (raw1394_set_port(handle, card) < 0) {
|
||||||
|
+ perror("couldn't set port");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ n = raw1394_get_nodecount(handle);
|
||||||
|
+ printf("%d nodes on bus, local ID is %d, IRM is %d\n",
|
||||||
|
+ n,
|
||||||
|
+ raw1394_get_local_id(handle) & 0x3f,
|
||||||
|
+ raw1394_get_irm_id(handle) & 0x3f);
|
||||||
|
+
|
||||||
|
+ if (n > 0) {
|
||||||
|
+ printf("\n - doing transactions with custom tag handler\n");
|
||||||
|
+ std_handler = raw1394_set_tag_handler(handle, my_tag_handler);
|
||||||
|
+ }
|
||||||
|
+ for (i = 0; i < n; i++) {
|
||||||
|
+ printf(" read from node %d... ", i);
|
||||||
|
+ fflush(stdout);
|
||||||
|
+ buffer = 0;
|
||||||
|
+
|
||||||
|
+ if (raw1394_start_read(handle, 0xffc0 | i, TESTADDR, 4,
|
||||||
|
+ &buffer, 0) < 0) {
|
||||||
|
+ perror("failed");
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (raw1394_loop_iterate(handle))
|
||||||
|
+ perror("failed");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (n > 0) {
|
||||||
|
+ printf("\n - using standard tag handler and synchronous calls\n");
|
||||||
|
+ raw1394_set_tag_handler(handle, std_handler);
|
||||||
|
+ }
|
||||||
|
+ for (i = 0; i < n; i++) {
|
||||||
|
+ printf(" read from node %d... ", i);
|
||||||
|
+ fflush(stdout);
|
||||||
|
+ buffer = 0;
|
||||||
|
+
|
||||||
|
+ retval = raw1394_read(handle, 0xffc0 | i, TESTADDR, 4, &buffer);
|
||||||
|
+ if (retval < 0)
|
||||||
|
+ perror("failed with error");
|
||||||
|
+ else
|
||||||
|
+ printf("completed with value 0x%08x\n", buffer);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
test_fcp(handle);
|
||||||
|
read_topology_map(handle);
|
||||||
|
+ test_config_rom(handle);
|
||||||
|
+ read_cycle_timer(handle);
|
||||||
|
|
||||||
|
- printf("testing config rom stuff\n");
|
||||||
|
- memset(rom, 0, sizeof(rom));
|
||||||
|
- retval=raw1394_get_config_rom(handle, rom, 0x100, &rom_size, &rom_version);
|
||||||
|
- printf("get_config_rom returned %d, romsize %d, rom_version %d\n",retval,rom_size,rom_version);
|
||||||
|
- printf("here are the first 10 quadlets:\n");
|
||||||
|
- for (i = 0; i < 10; i++)
|
||||||
|
- printf("%d. quadlet: 0x%08x\n",i,rom[i]);
|
||||||
|
-
|
||||||
|
- /* some manipulation */
|
||||||
|
-/* printf("incrementing 2nd quadlet\n");
|
||||||
|
- rom[0x02/4]++;
|
||||||
|
-*/
|
||||||
|
- retval=raw1394_update_config_rom(handle, rom, rom_size, rom_version);
|
||||||
|
- printf("update_config_rom returned %d\n",retval);
|
||||||
|
-
|
||||||
|
- printf("\nposting 0xdeadbeef as an echo request\n");
|
||||||
|
+ printf("\n - posting 0xdeadbeef as an echo request\n");
|
||||||
|
raw1394_echo_request(handle, 0xdeadbeef);
|
||||||
|
|
||||||
|
- printf("polling for leftover messages\n");
|
||||||
|
- pfd.fd = raw1394_get_fd(handle);
|
||||||
|
- pfd.events = POLLIN;
|
||||||
|
- pfd.revents = 0;
|
||||||
|
- while (1) {
|
||||||
|
- retval = poll(&pfd, 1, 10);
|
||||||
|
- if (retval < 1) break;
|
||||||
|
+ printf(" polling for leftover messages\n");
|
||||||
|
+ pfd.fd = raw1394_get_fd(handle);
|
||||||
|
+ pfd.events = POLLIN;
|
||||||
|
+ pfd.revents = 0;
|
||||||
|
+ while (1) {
|
||||||
|
+ retval = poll(&pfd, 1, 10);
|
||||||
|
+ if (retval < 1)
|
||||||
|
+ break;
|
||||||
|
retval = raw1394_loop_iterate(handle);
|
||||||
|
if (retval != 0)
|
||||||
|
- printf("raw1394_loop_iterate() returned 0x%08x\n", retval);
|
||||||
|
- }
|
||||||
|
+ printf(" raw1394_loop_iterate() returned 0x%08x\n",
|
||||||
|
+ retval);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (retval < 0)
|
||||||
|
+ perror("poll failed");
|
||||||
|
+out:
|
||||||
|
+ raw1394_destroy_handle(handle);
|
||||||
|
+ return numcards;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int main(int argc, char **argv)
|
||||||
|
+{
|
||||||
|
+ int card = 0, numcards;
|
||||||
|
+
|
||||||
|
+ do
|
||||||
|
+ numcards = test_card(card);
|
||||||
|
+ while (++card < numcards);
|
||||||
|
|
||||||
|
- if (retval < 0) perror("poll failed");
|
||||||
|
- exit(0);
|
||||||
|
+ return numcards < 0;
|
||||||
|
}
|
Loading…
Reference in new issue