[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:
parent
7b8d270352
commit
788442d403
|
@ -554,9 +554,6 @@ int raw1394_channel_modify (raw1394handle_t handle, unsigned int channel,
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
49
src/fw.c
49
src/fw.c
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
3
src/fw.h
3
src/fw.h
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Reference in New Issue