switch (request.type) {
case FW_ISO_CONTEXT_RECEIVE:
- if (request.sync > 15)
- return -EINVAL;
-
- if (request.tags == 0 || request.tags > 15)
- return -EINVAL;
-
if (request.header_size < 4 || (request.header_size & 3))
return -EINVAL;
return -EINVAL;
}
-
client->iso_context = fw_iso_context_create(client->device->card,
request.type,
request.channel,
request.speed,
- request.sync,
- request.tags,
request.header_size,
iso_callback, client);
if (IS_ERR(client->iso_context))
if (copy_from_user(&request, arg, sizeof request))
return -EFAULT;
- return fw_iso_context_start(client->iso_context, request.cycle);
+ if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) {
+ if (request.tags == 0 || request.tags > 15)
+ return -EINVAL;
+
+ if (request.sync > 15)
+ return -EINVAL;
+ }
+
+ return fw_iso_context_start(client->iso_context,
+ request.cycle, request.sync, request.tags);
}
static int ioctl_stop_iso(struct client *client, void __user *arg)
__u32 header_size;
__u32 channel;
__u32 speed;
- __u32 sync;
- __u32 tags;
};
struct fw_cdev_iso_packet {
struct fw_cdev_start_iso {
__s32 cycle;
+ __u32 sync;
+ __u32 tags;
};
#endif /* __fw_cdev_h */
struct fw_iso_context *
fw_iso_context_create(struct fw_card *card, int type,
- int channel, int speed,
- int sync, int tags, size_t header_size,
+ int channel, int speed, size_t header_size,
fw_iso_callback_t callback, void *callback_data)
{
struct fw_iso_context *ctx;
- ctx = card->driver->allocate_iso_context(card, type,
- sync, tags, header_size);
+ ctx = card->driver->allocate_iso_context(card, type, header_size);
if (IS_ERR(ctx))
return ctx;
ctx->type = type;
ctx->channel = channel;
ctx->speed = speed;
- ctx->sync = sync;
- ctx->tags = tags;
ctx->header_size = header_size;
ctx->callback = callback;
ctx->callback_data = callback_data;
EXPORT_SYMBOL(fw_iso_context_destroy);
int
-fw_iso_context_start(struct fw_iso_context *ctx, int cycle)
+fw_iso_context_start(struct fw_iso_context *ctx, int cycle, int sync, int tags)
{
- return ctx->card->driver->start_iso(ctx, cycle);
+ return ctx->card->driver->start_iso(ctx, cycle, sync, tags);
}
EXPORT_SYMBOL(fw_iso_context_start);
}
static struct fw_iso_context *
-ohci_allocate_iso_context(struct fw_card *card, int type,
- int sync, int tags, size_t header_size)
+ohci_allocate_iso_context(struct fw_card *card, int type, size_t header_size)
{
struct fw_ohci *ohci = fw_ohci(card);
struct iso_context *ctx, *list;
return ERR_PTR(retval);
}
-static int ohci_start_iso(struct fw_iso_context *base, s32 cycle)
+static int ohci_start_iso(struct fw_iso_context *base,
+ s32 cycle, u32 sync, u32 tags)
{
struct iso_context *ctx = container_of(base, struct iso_context, base);
struct fw_ohci *ohci = ctx->context.ohci;
reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 1 << index);
reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, 1 << index);
reg_write(ohci, context_match(ctx->context.regs),
- (ctx->base.tags << 28) |
- (ctx->base.sync << 8) | ctx->base.channel);
+ (tags << 28) | (sync << 8) | ctx->base.channel);
context_run(&ctx->context,
IR_CONTEXT_DUAL_BUFFER_MODE |
IR_CONTEXT_ISOCH_HEADER);
int type;
int channel;
int speed;
- int sync;
- int tags;
size_t header_size;
fw_iso_callback_t callback;
void *callback_data;
struct fw_iso_context *
fw_iso_context_create(struct fw_card *card, int type,
- int channel, int speed,
- int sync, int tags, size_t header_size,
+ int channel, int speed, size_t header_size,
fw_iso_callback_t callback, void *callback_data);
void
unsigned long payload);
int
-fw_iso_context_start(struct fw_iso_context *ctx, int cycle);
+fw_iso_context_start(struct fw_iso_context *ctx,
+ int cycle, int sync, int tags);
int
fw_iso_context_stop(struct fw_iso_context *ctx);
u64 (*get_bus_time) (struct fw_card *card);
struct fw_iso_context *
- (*allocate_iso_context)(struct fw_card *card, int sync, int tags,
+ (*allocate_iso_context)(struct fw_card *card,
int type, size_t header_size);
void (*free_iso_context)(struct fw_iso_context *ctx);
- int (*start_iso)(struct fw_iso_context *ctx, s32 cycle);
+ int (*start_iso)(struct fw_iso_context *ctx,
+ s32 cycle, u32 sync, u32 tags);
int (*queue_iso)(struct fw_iso_context *ctx,
struct fw_iso_packet *packet,