[libraw1394 patch] Fix raw1394_channel_modify() on firewire-core

(juju)

Reported by Adrian Knoth:  fw_channel_modify() was unable to allocate
some channels which were actually free.
http://marc.info/?l=linux1394-devel&t=122818128900002

This can be easily fixed by replacing fw_channel_modify() by
ieee1394_channel_modify() because this is highlevel enough to work with
Juju as well.  We only may want a separate fw_channel_modify() in the
future when firewire-core gains a special ioctl() for that.

Also fix a documentation typo:  raw1394_channel_modify() did not show up
in extracted API documentation due to a cut'n'paste typo in raw1394.h.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Dan Dennedy <dan@dennedy.org>
This commit is contained in:
Stefan Richter 2008-12-02 12:39:34 +01:00 committed by Dan Dennedy
parent 7b8d270352
commit 788442d403
4 changed files with 2 additions and 57 deletions

View File

@ -554,10 +554,7 @@ int raw1394_channel_modify (raw1394handle_t handle, unsigned int channel,
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (handle->is_fw) return ieee1394_channel_modify(handle, channel, mode);
return fw_channel_modify(handle, channel, mode);
else
return ieee1394_channel_modify(handle, channel, mode);
} }
int raw1394_iso_xmit_init(raw1394handle_t handle, int raw1394_iso_xmit_init(raw1394handle_t handle,

View File

@ -1342,52 +1342,3 @@ fw_bandwidth_modify (raw1394handle_t handle,
return 0; 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;
}

View File

@ -214,9 +214,6 @@ int fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer,
int fw_bandwidth_modify (raw1394handle_t handle, int fw_bandwidth_modify (raw1394handle_t handle,
unsigned int bandwidth, unsigned int bandwidth,
enum raw1394_modify_mode mode); 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 fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle,
int prebuffer_packets); int prebuffer_packets);

View File

@ -1203,7 +1203,7 @@ raw1394_bandwidth_modify (raw1394handle_t handle, unsigned int bandwidth,
enum raw1394_modify_mode mode); 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 * @handle: a libraw1394 handle
* @channel: isochronous channel * @channel: isochronous channel
* @mode: whether to allocate or free * @mode: whether to allocate or free