diff options
Diffstat (limited to 'drivers/firewire/core-cdev.c')
| -rw-r--r-- | drivers/firewire/core-cdev.c | 32 | 
1 files changed, 26 insertions, 6 deletions
| diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index fb6c651214f3..9f89c17730b1 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -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) |