if (copy_from_user(&request, arg, sizeof request))
return -EFAULT;
+ if (request.type > FW_ISO_CONTEXT_RECEIVE)
+ return -EINVAL;
+
client->iso_context = fw_iso_context_create(client->device->card,
- FW_ISO_CONTEXT_TRANSMIT,
+ request.type,
+ request.header_size,
iso_callback, client);
if (IS_ERR(client->iso_context))
return PTR_ERR(client->iso_context);
{
struct fw_cdev_queue_iso request;
struct fw_cdev_iso_packet __user *p, *end, *next;
- unsigned long payload, payload_end;
+ unsigned long payload, payload_end, header_length;
int count;
struct {
struct fw_iso_packet packet;
while (p < end) {
if (__copy_from_user(&u.packet, p, sizeof *p))
return -EFAULT;
+
+ if (client->iso_context->type == FW_ISO_CONTEXT_TRANSMIT) {
+ header_length = u.packet.header_length;
+ } else {
+ /* We require that header_length is a multiple of
+ * the fixed header size, ctx->header_size */
+ if (u.packet.header_length % client->iso_context->header_size != 0)
+ return -EINVAL;
+ header_length = 0;
+ }
+
next = (struct fw_cdev_iso_packet __user *)
- &p->header[u.packet.header_length / 4];
+ &p->header[header_length / 4];
if (next > end)
return -EINVAL;
if (__copy_from_user
- (u.packet.header, p->header, u.packet.header_length))
+ (u.packet.header, p->header, header_length))
return -EFAULT;
if (u.packet.skip &&
u.packet.header_length + u.packet.payload_length > 0)
return count;
}
-static int ioctl_send_iso(struct client *client, void __user *arg)
+static int ioctl_start_iso(struct client *client, void __user *arg)
{
- struct fw_cdev_send_iso request;
+ struct fw_cdev_start_iso request;
if (copy_from_user(&request, arg, sizeof request))
return -EFAULT;
- return fw_iso_context_send(client->iso_context, request.channel,
- request.speed, request.cycle);
+ return fw_iso_context_start(client->iso_context, request.channel,
+ request.speed, request.cycle);
}
static int
return ioctl_create_iso_context(client, arg);
case FW_CDEV_IOC_QUEUE_ISO:
return ioctl_queue_iso(client, arg);
- case FW_CDEV_IOC_SEND_ISO:
- return ioctl_send_iso(client, arg);
+ case FW_CDEV_IOC_START_ISO:
+ return ioctl_start_iso(client, arg);
default:
return -EINVAL;
}