summaryrefslogtreecommitdiffstats
path: root/src/fw.c
diff options
context:
space:
mode:
authorGravatar Stefan Richter 2011-08-13 17:08:29 +0200
committerGravatar Stefan Richter 2011-08-21 20:25:50 +0200
commitdb5f202d5d050cb78bb6696f7ec56954da3a8a6c (patch)
treed6d201637fcb088cb151cb7a310ee1d900daf58a /src/fw.c
parentconfigure.ac, Changelog, NEWS: update to version 2.0.7 (diff)
redirect Config ROM reads into the kernel's ROM cache
The kernel already read each node's Configuration ROM and cached it. So let all libraw1394 clients read from that cache instead of having to perform all those transactions all over again. This reduces bus traffic at application start-up and at each bus reset. It also makes all Configuration ROM accesses fool-proof and robust. This together with the kernel patch "firewire: core: handle ack_busy when fetching the Config ROM" lets me use an old Panasonic camcorder which requires us to keep pauses between response and request --- longer than librom1394's retry pause --- with dvgrab (though still with frequent failures of write requests to FCP_COMMAND, i.e. with lots of "send oops" noise in the console and occasionally having to repeat key-presses in interactive mode). For simplicity of implementation, only the blocking raw1394_read() is modified, not the nonblocking raw1394_start_read(). Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> Signed-off-by: Dan Dennedy <dan@dennedy.org>
Diffstat (limited to '')
-rw-r--r--src/fw.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/fw.c b/src/fw.c
index baa3e93..fc51e2f 100644
--- a/src/fw.c
+++ b/src/fw.c
@@ -1310,11 +1310,63 @@ send_request_sync(raw1394handle_t handle, int tcode,
}
int
+read_config_rom(fw_handle_t handle, nodeid_t node, nodeaddr_t addr,
+ size_t length, quadlet_t *buffer)
+{
+ struct fw_cdev_get_info get_info;
+ quadlet_t rom[256];
+ int offset, fd, i, err;
+
+ if (node > handle->reset.root_node_id) {
+ handle->err = -RCODE_NO_ACK;
+ errno = fw_errcode_to_errno(handle->err);
+ return -1;
+ }
+
+ i = handle->nodes[node & 0x3f];
+ if (i == -1) {
+ handle->err = -RCODE_NO_ACK;
+ errno = fw_errcode_to_errno(handle->err);
+ return -1;
+ }
+
+ if (handle->generation != handle->devices[i].generation) {
+ handle->err = -RCODE_GENERATION;
+ errno = fw_errcode_to_errno(handle->err);
+ return -1;
+ }
+ fd = handle->devices[i].fd;
+
+ memset(&get_info, 0, sizeof(get_info));
+ memset(&rom, 0, sizeof(rom));
+ get_info.version = IMPLEMENTED_CDEV_ABI_VERSION;
+ get_info.rom = ptr_to_u64(rom);
+ get_info.rom_length = sizeof(rom);
+ get_info.bus_reset = 0;
+
+ err = ioctl(fd, FW_CDEV_IOC_GET_INFO, &get_info);
+ if (err)
+ return err;
+
+ offset = (addr - CSR_REGISTER_BASE - CSR_CONFIG_ROM) / 4;
+ for (i = 0; i < length / 4; i++)
+ buffer[i] = cpu_to_be32(rom[offset + i]);
+
+ return 0;
+}
+
+int
fw_read(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
size_t length, quadlet_t *buffer)
{
int tcode;
+ if (addr >= CSR_REGISTER_BASE + CSR_CONFIG_ROM &&
+ addr + length <= CSR_REGISTER_BASE + CSR_CONFIG_ROM_END &&
+ !(addr & 3) && length > 0 && !(length & 3))
+ return read_config_rom(handle->mode.fw,
+ node, addr, length, buffer);
+
if (length == 4)
tcode = TCODE_READ_QUADLET_REQUEST;
else
/td>-3/+25 2003-07-17pkg-config support from Kristian Hogsberg.Gravatar bencollins 3-1/+15 2003-07-17Remove trailing whitespace, which automake chokes on.Gravatar bencollins 1-1/+1 2003-07-13Fixed section for -dev package.Gravatar bencollins 1-1/+1 2003-07-13Re-add the pdf buildGravatar bencollins 1-0/+1 2003-07-13Update Debian files.Gravatar bencollins 4-25/+73 2003-07-13Ok, the Debian package was way out of sync with upstreamGravatar bencollins 1-1/+1 2003-07-13Ooops...libtool works a bit different than I thought, but atleast it worksGravatar bencollins 2-6/+1 2003-07-13Generate and install the pdf in the Debian package.Gravatar bencollins 3-3/+4 2003-07-13Don't run configure at the end of autogen.sh. Also, remove autom4te.cache.Gravatar bencollins 1-1/+1 2003-07-13Update Debian maintainerGravatar bencollins 1-1/+2 2003-07-13Update Debian changelog.Gravatar bencollins 1-0/+8 2003-07-13File doesn't really seem needed. The NEWS file gives a good overview, andGravatar bencollins 1-4/+0 2003-07-13Fix compiler warnings.Gravatar bencollins 4-12/+22 2003-07-13Updates from 0.10.0 release.Gravatar bencollins 4-5/+14 2003-04-23add libtoolize to bootstrapGravatar ddennedy 1-1/+10 2003-04-21added Dan Maas' rawiso docsGravatar ddennedy 1-32/+295 2003-04-07new_handle_on_port() error path fix from Jim RadfordGravatar dmaas 1-1/+3 2003-03-26add raw1394_new_handle_on_port() convenience functionGravatar dmaas 2-1/+41 2003-02-22Updates for new rawiso ioctl interface.Gravatar bencollins 3-37/+125 2003-01-15add iso_xmit_sync() and iso_xmit_write(); clean up iso handling a bitGravatar dmaas 5-39/+161 2003-01-15implement tag matching for rawiso receptionGravatar dmaas 3-4/+12 2003-01-06back out previous commit - don't drop the legacy API just yetGravatar dmaas 6-173/+130 2003-01-05emulate legacy ISO reception API on top of new rawiso APIGravatar dmaas 7-131/+174 2002-12-24update iso API for multi-channel reception and new packet buffer layoutGravatar dmaas 4-123/+236 2002-12-20oops, irq_interval needs to be signedGravatar anonymous 1-1/+1 2002-12-20dmaas - renamed exported arm definitions into the raw1394_ namespace; brought...Gravatar anonymous 3-124/+48 2002-12-16rawiso updates:Gravatar dmaas 3-18/+25 2002-11-18fix cplusplus extern C blockGravatar ddennedy 1-4/+4 2002-11-18merged rawiso branchGravatar ddennedy 7-6/+488