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,