Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / firewire / core-cdev.c
index fb6c651..9f89c17 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
+#include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/firewire.h>
 #include <linux/firewire-cdev.h>
@@ -953,11 +954,25 @@ static enum dma_data_direction iso_dma_direction(struct fw_iso_context *context)
                        return DMA_FROM_DEVICE;
 }
 
+static struct fw_iso_context *fw_iso_mc_context_create(struct fw_card *card,
+                                               fw_iso_mc_callback_t callback,
+                                               void *callback_data)
+{
+       struct fw_iso_context *ctx;
+
+       ctx = fw_iso_context_create(card, FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL,
+                                   0, 0, 0, NULL, callback_data);
+       if (!IS_ERR(ctx))
+               ctx->callback.mc = callback;
+
+       return ctx;
+}
+
 static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
 {
        struct fw_cdev_create_iso_context *a = &arg->create_iso_context;
        struct fw_iso_context *context;
-       fw_iso_callback_t cb;
+       union fw_iso_callback cb;
        int ret;
 
        BUILD_BUG_ON(FW_CDEV_ISO_CONTEXT_TRANSMIT != FW_ISO_CONTEXT_TRANSMIT ||
@@ -970,7 +985,7 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
                if (a->speed > SCODE_3200 || a->channel > 63)
                        return -EINVAL;
 
-               cb = iso_callback;
+               cb.sc = iso_callback;
                break;
 
        case FW_ISO_CONTEXT_RECEIVE:
@@ -978,19 +993,24 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
                    a->channel > 63)
                        return -EINVAL;
 
-               cb = iso_callback;
+               cb.sc = iso_callback;
                break;
 
        case FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL:
-               cb = (fw_iso_callback_t)iso_mc_callback;
+               cb.mc = iso_mc_callback;
                break;
 
        default:
                return -EINVAL;
        }
 
-       context = fw_iso_context_create(client->device->card, a->type,
-                       a->channel, a->speed, a->header_size, cb, client);
+       if (a->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL)
+               context = fw_iso_mc_context_create(client->device->card, cb.mc,
+                                                  client);
+       else
+               context = fw_iso_context_create(client->device->card, a->type,
+                                               a->channel, a->speed,
+                                               a->header_size, cb.sc, client);
        if (IS_ERR(context))
                return PTR_ERR(context);
        if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)