cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

seq_clientmgr.c (66736B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  ALSA sequencer Client Manager
      4 *  Copyright (c) 1998-2001 by Frank van de Pol <fvdpol@coil.demon.nl>
      5 *                             Jaroslav Kysela <perex@perex.cz>
      6 *                             Takashi Iwai <tiwai@suse.de>
      7 */
      8
      9#include <linux/init.h>
     10#include <linux/export.h>
     11#include <linux/slab.h>
     12#include <sound/core.h>
     13#include <sound/minors.h>
     14#include <linux/kmod.h>
     15
     16#include <sound/seq_kernel.h>
     17#include "seq_clientmgr.h"
     18#include "seq_memory.h"
     19#include "seq_queue.h"
     20#include "seq_timer.h"
     21#include "seq_info.h"
     22#include "seq_system.h"
     23#include <sound/seq_device.h>
     24#ifdef CONFIG_COMPAT
     25#include <linux/compat.h>
     26#endif
     27
     28/* Client Manager
     29
     30 * this module handles the connections of userland and kernel clients
     31 * 
     32 */
     33
     34/*
     35 * There are four ranges of client numbers (last two shared):
     36 * 0..15: global clients
     37 * 16..127: statically allocated client numbers for cards 0..27
     38 * 128..191: dynamically allocated client numbers for cards 28..31
     39 * 128..191: dynamically allocated client numbers for applications
     40 */
     41
     42/* number of kernel non-card clients */
     43#define SNDRV_SEQ_GLOBAL_CLIENTS	16
     44/* clients per cards, for static clients */
     45#define SNDRV_SEQ_CLIENTS_PER_CARD	4
     46/* dynamically allocated client numbers (both kernel drivers and user space) */
     47#define SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN	128
     48
     49#define SNDRV_SEQ_LFLG_INPUT	0x0001
     50#define SNDRV_SEQ_LFLG_OUTPUT	0x0002
     51#define SNDRV_SEQ_LFLG_OPEN	(SNDRV_SEQ_LFLG_INPUT|SNDRV_SEQ_LFLG_OUTPUT)
     52
     53static DEFINE_SPINLOCK(clients_lock);
     54static DEFINE_MUTEX(register_mutex);
     55
     56/*
     57 * client table
     58 */
     59static char clienttablock[SNDRV_SEQ_MAX_CLIENTS];
     60static struct snd_seq_client *clienttab[SNDRV_SEQ_MAX_CLIENTS];
     61static struct snd_seq_usage client_usage;
     62
     63/*
     64 * prototypes
     65 */
     66static int bounce_error_event(struct snd_seq_client *client,
     67			      struct snd_seq_event *event,
     68			      int err, int atomic, int hop);
     69static int snd_seq_deliver_single_event(struct snd_seq_client *client,
     70					struct snd_seq_event *event,
     71					int filter, int atomic, int hop);
     72
     73/*
     74 */
     75static inline unsigned short snd_seq_file_flags(struct file *file)
     76{
     77        switch (file->f_mode & (FMODE_READ | FMODE_WRITE)) {
     78        case FMODE_WRITE:
     79                return SNDRV_SEQ_LFLG_OUTPUT;
     80        case FMODE_READ:
     81                return SNDRV_SEQ_LFLG_INPUT;
     82        default:
     83                return SNDRV_SEQ_LFLG_OPEN;
     84        }
     85}
     86
     87static inline int snd_seq_write_pool_allocated(struct snd_seq_client *client)
     88{
     89	return snd_seq_total_cells(client->pool) > 0;
     90}
     91
     92/* return pointer to client structure for specified id */
     93static struct snd_seq_client *clientptr(int clientid)
     94{
     95	if (clientid < 0 || clientid >= SNDRV_SEQ_MAX_CLIENTS) {
     96		pr_debug("ALSA: seq: oops. Trying to get pointer to client %d\n",
     97			   clientid);
     98		return NULL;
     99	}
    100	return clienttab[clientid];
    101}
    102
    103struct snd_seq_client *snd_seq_client_use_ptr(int clientid)
    104{
    105	unsigned long flags;
    106	struct snd_seq_client *client;
    107
    108	if (clientid < 0 || clientid >= SNDRV_SEQ_MAX_CLIENTS) {
    109		pr_debug("ALSA: seq: oops. Trying to get pointer to client %d\n",
    110			   clientid);
    111		return NULL;
    112	}
    113	spin_lock_irqsave(&clients_lock, flags);
    114	client = clientptr(clientid);
    115	if (client)
    116		goto __lock;
    117	if (clienttablock[clientid]) {
    118		spin_unlock_irqrestore(&clients_lock, flags);
    119		return NULL;
    120	}
    121	spin_unlock_irqrestore(&clients_lock, flags);
    122#ifdef CONFIG_MODULES
    123	if (!in_interrupt()) {
    124		static char client_requested[SNDRV_SEQ_GLOBAL_CLIENTS];
    125		static char card_requested[SNDRV_CARDS];
    126		if (clientid < SNDRV_SEQ_GLOBAL_CLIENTS) {
    127			int idx;
    128			
    129			if (!client_requested[clientid]) {
    130				client_requested[clientid] = 1;
    131				for (idx = 0; idx < 15; idx++) {
    132					if (seq_client_load[idx] < 0)
    133						break;
    134					if (seq_client_load[idx] == clientid) {
    135						request_module("snd-seq-client-%i",
    136							       clientid);
    137						break;
    138					}
    139				}
    140			}
    141		} else if (clientid < SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN) {
    142			int card = (clientid - SNDRV_SEQ_GLOBAL_CLIENTS) /
    143				SNDRV_SEQ_CLIENTS_PER_CARD;
    144			if (card < snd_ecards_limit) {
    145				if (! card_requested[card]) {
    146					card_requested[card] = 1;
    147					snd_request_card(card);
    148				}
    149				snd_seq_device_load_drivers();
    150			}
    151		}
    152		spin_lock_irqsave(&clients_lock, flags);
    153		client = clientptr(clientid);
    154		if (client)
    155			goto __lock;
    156		spin_unlock_irqrestore(&clients_lock, flags);
    157	}
    158#endif
    159	return NULL;
    160
    161      __lock:
    162	snd_use_lock_use(&client->use_lock);
    163	spin_unlock_irqrestore(&clients_lock, flags);
    164	return client;
    165}
    166
    167/* Take refcount and perform ioctl_mutex lock on the given client;
    168 * used only for OSS sequencer
    169 * Unlock via snd_seq_client_ioctl_unlock() below
    170 */
    171bool snd_seq_client_ioctl_lock(int clientid)
    172{
    173	struct snd_seq_client *client;
    174
    175	client = snd_seq_client_use_ptr(clientid);
    176	if (!client)
    177		return false;
    178	mutex_lock(&client->ioctl_mutex);
    179	/* The client isn't unrefed here; see snd_seq_client_ioctl_unlock() */
    180	return true;
    181}
    182EXPORT_SYMBOL_GPL(snd_seq_client_ioctl_lock);
    183
    184/* Unlock and unref the given client; for OSS sequencer use only */
    185void snd_seq_client_ioctl_unlock(int clientid)
    186{
    187	struct snd_seq_client *client;
    188
    189	client = snd_seq_client_use_ptr(clientid);
    190	if (WARN_ON(!client))
    191		return;
    192	mutex_unlock(&client->ioctl_mutex);
    193	/* The doubly unrefs below are intentional; the first one releases the
    194	 * leftover from snd_seq_client_ioctl_lock() above, and the second one
    195	 * is for releasing snd_seq_client_use_ptr() in this function
    196	 */
    197	snd_seq_client_unlock(client);
    198	snd_seq_client_unlock(client);
    199}
    200EXPORT_SYMBOL_GPL(snd_seq_client_ioctl_unlock);
    201
    202static void usage_alloc(struct snd_seq_usage *res, int num)
    203{
    204	res->cur += num;
    205	if (res->cur > res->peak)
    206		res->peak = res->cur;
    207}
    208
    209static void usage_free(struct snd_seq_usage *res, int num)
    210{
    211	res->cur -= num;
    212}
    213
    214/* initialise data structures */
    215int __init client_init_data(void)
    216{
    217	/* zap out the client table */
    218	memset(&clienttablock, 0, sizeof(clienttablock));
    219	memset(&clienttab, 0, sizeof(clienttab));
    220	return 0;
    221}
    222
    223
    224static struct snd_seq_client *seq_create_client1(int client_index, int poolsize)
    225{
    226	int c;
    227	struct snd_seq_client *client;
    228
    229	/* init client data */
    230	client = kzalloc(sizeof(*client), GFP_KERNEL);
    231	if (client == NULL)
    232		return NULL;
    233	client->pool = snd_seq_pool_new(poolsize);
    234	if (client->pool == NULL) {
    235		kfree(client);
    236		return NULL;
    237	}
    238	client->type = NO_CLIENT;
    239	snd_use_lock_init(&client->use_lock);
    240	rwlock_init(&client->ports_lock);
    241	mutex_init(&client->ports_mutex);
    242	INIT_LIST_HEAD(&client->ports_list_head);
    243	mutex_init(&client->ioctl_mutex);
    244
    245	/* find free slot in the client table */
    246	spin_lock_irq(&clients_lock);
    247	if (client_index < 0) {
    248		for (c = SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN;
    249		     c < SNDRV_SEQ_MAX_CLIENTS;
    250		     c++) {
    251			if (clienttab[c] || clienttablock[c])
    252				continue;
    253			clienttab[client->number = c] = client;
    254			spin_unlock_irq(&clients_lock);
    255			return client;
    256		}
    257	} else {
    258		if (clienttab[client_index] == NULL && !clienttablock[client_index]) {
    259			clienttab[client->number = client_index] = client;
    260			spin_unlock_irq(&clients_lock);
    261			return client;
    262		}
    263	}
    264	spin_unlock_irq(&clients_lock);
    265	snd_seq_pool_delete(&client->pool);
    266	kfree(client);
    267	return NULL;	/* no free slot found or busy, return failure code */
    268}
    269
    270
    271static int seq_free_client1(struct snd_seq_client *client)
    272{
    273	if (!client)
    274		return 0;
    275	spin_lock_irq(&clients_lock);
    276	clienttablock[client->number] = 1;
    277	clienttab[client->number] = NULL;
    278	spin_unlock_irq(&clients_lock);
    279	snd_seq_delete_all_ports(client);
    280	snd_seq_queue_client_leave(client->number);
    281	snd_use_lock_sync(&client->use_lock);
    282	if (client->pool)
    283		snd_seq_pool_delete(&client->pool);
    284	spin_lock_irq(&clients_lock);
    285	clienttablock[client->number] = 0;
    286	spin_unlock_irq(&clients_lock);
    287	return 0;
    288}
    289
    290
    291static void seq_free_client(struct snd_seq_client * client)
    292{
    293	mutex_lock(&register_mutex);
    294	switch (client->type) {
    295	case NO_CLIENT:
    296		pr_warn("ALSA: seq: Trying to free unused client %d\n",
    297			client->number);
    298		break;
    299	case USER_CLIENT:
    300	case KERNEL_CLIENT:
    301		seq_free_client1(client);
    302		usage_free(&client_usage, 1);
    303		break;
    304
    305	default:
    306		pr_err("ALSA: seq: Trying to free client %d with undefined type = %d\n",
    307			   client->number, client->type);
    308	}
    309	mutex_unlock(&register_mutex);
    310
    311	snd_seq_system_client_ev_client_exit(client->number);
    312}
    313
    314
    315
    316/* -------------------------------------------------------- */
    317
    318/* create a user client */
    319static int snd_seq_open(struct inode *inode, struct file *file)
    320{
    321	int c, mode;			/* client id */
    322	struct snd_seq_client *client;
    323	struct snd_seq_user_client *user;
    324	int err;
    325
    326	err = stream_open(inode, file);
    327	if (err < 0)
    328		return err;
    329
    330	mutex_lock(&register_mutex);
    331	client = seq_create_client1(-1, SNDRV_SEQ_DEFAULT_EVENTS);
    332	if (!client) {
    333		mutex_unlock(&register_mutex);
    334		return -ENOMEM;	/* failure code */
    335	}
    336
    337	mode = snd_seq_file_flags(file);
    338	if (mode & SNDRV_SEQ_LFLG_INPUT)
    339		client->accept_input = 1;
    340	if (mode & SNDRV_SEQ_LFLG_OUTPUT)
    341		client->accept_output = 1;
    342
    343	user = &client->data.user;
    344	user->fifo = NULL;
    345	user->fifo_pool_size = 0;
    346
    347	if (mode & SNDRV_SEQ_LFLG_INPUT) {
    348		user->fifo_pool_size = SNDRV_SEQ_DEFAULT_CLIENT_EVENTS;
    349		user->fifo = snd_seq_fifo_new(user->fifo_pool_size);
    350		if (user->fifo == NULL) {
    351			seq_free_client1(client);
    352			kfree(client);
    353			mutex_unlock(&register_mutex);
    354			return -ENOMEM;
    355		}
    356	}
    357
    358	usage_alloc(&client_usage, 1);
    359	client->type = USER_CLIENT;
    360	mutex_unlock(&register_mutex);
    361
    362	c = client->number;
    363	file->private_data = client;
    364
    365	/* fill client data */
    366	user->file = file;
    367	sprintf(client->name, "Client-%d", c);
    368	client->data.user.owner = get_pid(task_pid(current));
    369
    370	/* make others aware this new client */
    371	snd_seq_system_client_ev_client_start(c);
    372
    373	return 0;
    374}
    375
    376/* delete a user client */
    377static int snd_seq_release(struct inode *inode, struct file *file)
    378{
    379	struct snd_seq_client *client = file->private_data;
    380
    381	if (client) {
    382		seq_free_client(client);
    383		if (client->data.user.fifo)
    384			snd_seq_fifo_delete(&client->data.user.fifo);
    385		put_pid(client->data.user.owner);
    386		kfree(client);
    387	}
    388
    389	return 0;
    390}
    391
    392
    393/* handle client read() */
    394/* possible error values:
    395 *	-ENXIO	invalid client or file open mode
    396 *	-ENOSPC	FIFO overflow (the flag is cleared after this error report)
    397 *	-EINVAL	no enough user-space buffer to write the whole event
    398 *	-EFAULT	seg. fault during copy to user space
    399 */
    400static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count,
    401			    loff_t *offset)
    402{
    403	struct snd_seq_client *client = file->private_data;
    404	struct snd_seq_fifo *fifo;
    405	int err;
    406	long result = 0;
    407	struct snd_seq_event_cell *cell;
    408
    409	if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_INPUT))
    410		return -ENXIO;
    411
    412	if (!access_ok(buf, count))
    413		return -EFAULT;
    414
    415	/* check client structures are in place */
    416	if (snd_BUG_ON(!client))
    417		return -ENXIO;
    418
    419	if (!client->accept_input)
    420		return -ENXIO;
    421	fifo = client->data.user.fifo;
    422	if (!fifo)
    423		return -ENXIO;
    424
    425	if (atomic_read(&fifo->overflow) > 0) {
    426		/* buffer overflow is detected */
    427		snd_seq_fifo_clear(fifo);
    428		/* return error code */
    429		return -ENOSPC;
    430	}
    431
    432	cell = NULL;
    433	err = 0;
    434	snd_seq_fifo_lock(fifo);
    435
    436	/* while data available in queue */
    437	while (count >= sizeof(struct snd_seq_event)) {
    438		int nonblock;
    439
    440		nonblock = (file->f_flags & O_NONBLOCK) || result > 0;
    441		err = snd_seq_fifo_cell_out(fifo, &cell, nonblock);
    442		if (err < 0)
    443			break;
    444		if (snd_seq_ev_is_variable(&cell->event)) {
    445			struct snd_seq_event tmpev;
    446			tmpev = cell->event;
    447			tmpev.data.ext.len &= ~SNDRV_SEQ_EXT_MASK;
    448			if (copy_to_user(buf, &tmpev, sizeof(struct snd_seq_event))) {
    449				err = -EFAULT;
    450				break;
    451			}
    452			count -= sizeof(struct snd_seq_event);
    453			buf += sizeof(struct snd_seq_event);
    454			err = snd_seq_expand_var_event(&cell->event, count,
    455						       (char __force *)buf, 0,
    456						       sizeof(struct snd_seq_event));
    457			if (err < 0)
    458				break;
    459			result += err;
    460			count -= err;
    461			buf += err;
    462		} else {
    463			if (copy_to_user(buf, &cell->event, sizeof(struct snd_seq_event))) {
    464				err = -EFAULT;
    465				break;
    466			}
    467			count -= sizeof(struct snd_seq_event);
    468			buf += sizeof(struct snd_seq_event);
    469		}
    470		snd_seq_cell_free(cell);
    471		cell = NULL; /* to be sure */
    472		result += sizeof(struct snd_seq_event);
    473	}
    474
    475	if (err < 0) {
    476		if (cell)
    477			snd_seq_fifo_cell_putback(fifo, cell);
    478		if (err == -EAGAIN && result > 0)
    479			err = 0;
    480	}
    481	snd_seq_fifo_unlock(fifo);
    482
    483	return (err < 0) ? err : result;
    484}
    485
    486
    487/*
    488 * check access permission to the port
    489 */
    490static int check_port_perm(struct snd_seq_client_port *port, unsigned int flags)
    491{
    492	if ((port->capability & flags) != flags)
    493		return 0;
    494	return flags;
    495}
    496
    497/*
    498 * check if the destination client is available, and return the pointer
    499 * if filter is non-zero, client filter bitmap is tested.
    500 */
    501static struct snd_seq_client *get_event_dest_client(struct snd_seq_event *event,
    502						    int filter)
    503{
    504	struct snd_seq_client *dest;
    505
    506	dest = snd_seq_client_use_ptr(event->dest.client);
    507	if (dest == NULL)
    508		return NULL;
    509	if (! dest->accept_input)
    510		goto __not_avail;
    511	if ((dest->filter & SNDRV_SEQ_FILTER_USE_EVENT) &&
    512	    ! test_bit(event->type, dest->event_filter))
    513		goto __not_avail;
    514	if (filter && !(dest->filter & filter))
    515		goto __not_avail;
    516
    517	return dest; /* ok - accessible */
    518__not_avail:
    519	snd_seq_client_unlock(dest);
    520	return NULL;
    521}
    522
    523
    524/*
    525 * Return the error event.
    526 *
    527 * If the receiver client is a user client, the original event is
    528 * encapsulated in SNDRV_SEQ_EVENT_BOUNCE as variable length event.  If
    529 * the original event is also variable length, the external data is
    530 * copied after the event record. 
    531 * If the receiver client is a kernel client, the original event is
    532 * quoted in SNDRV_SEQ_EVENT_KERNEL_ERROR, since this requires no extra
    533 * kmalloc.
    534 */
    535static int bounce_error_event(struct snd_seq_client *client,
    536			      struct snd_seq_event *event,
    537			      int err, int atomic, int hop)
    538{
    539	struct snd_seq_event bounce_ev;
    540	int result;
    541
    542	if (client == NULL ||
    543	    ! (client->filter & SNDRV_SEQ_FILTER_BOUNCE) ||
    544	    ! client->accept_input)
    545		return 0; /* ignored */
    546
    547	/* set up quoted error */
    548	memset(&bounce_ev, 0, sizeof(bounce_ev));
    549	bounce_ev.type = SNDRV_SEQ_EVENT_KERNEL_ERROR;
    550	bounce_ev.flags = SNDRV_SEQ_EVENT_LENGTH_FIXED;
    551	bounce_ev.queue = SNDRV_SEQ_QUEUE_DIRECT;
    552	bounce_ev.source.client = SNDRV_SEQ_CLIENT_SYSTEM;
    553	bounce_ev.source.port = SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE;
    554	bounce_ev.dest.client = client->number;
    555	bounce_ev.dest.port = event->source.port;
    556	bounce_ev.data.quote.origin = event->dest;
    557	bounce_ev.data.quote.event = event;
    558	bounce_ev.data.quote.value = -err; /* use positive value */
    559	result = snd_seq_deliver_single_event(NULL, &bounce_ev, 0, atomic, hop + 1);
    560	if (result < 0) {
    561		client->event_lost++;
    562		return result;
    563	}
    564
    565	return result;
    566}
    567
    568
    569/*
    570 * rewrite the time-stamp of the event record with the curren time
    571 * of the given queue.
    572 * return non-zero if updated.
    573 */
    574static int update_timestamp_of_queue(struct snd_seq_event *event,
    575				     int queue, int real_time)
    576{
    577	struct snd_seq_queue *q;
    578
    579	q = queueptr(queue);
    580	if (! q)
    581		return 0;
    582	event->queue = queue;
    583	event->flags &= ~SNDRV_SEQ_TIME_STAMP_MASK;
    584	if (real_time) {
    585		event->time.time = snd_seq_timer_get_cur_time(q->timer, true);
    586		event->flags |= SNDRV_SEQ_TIME_STAMP_REAL;
    587	} else {
    588		event->time.tick = snd_seq_timer_get_cur_tick(q->timer);
    589		event->flags |= SNDRV_SEQ_TIME_STAMP_TICK;
    590	}
    591	queuefree(q);
    592	return 1;
    593}
    594
    595
    596/*
    597 * deliver an event to the specified destination.
    598 * if filter is non-zero, client filter bitmap is tested.
    599 *
    600 *  RETURN VALUE: 0 : if succeeded
    601 *		 <0 : error
    602 */
    603static int snd_seq_deliver_single_event(struct snd_seq_client *client,
    604					struct snd_seq_event *event,
    605					int filter, int atomic, int hop)
    606{
    607	struct snd_seq_client *dest = NULL;
    608	struct snd_seq_client_port *dest_port = NULL;
    609	int result = -ENOENT;
    610	int direct;
    611
    612	direct = snd_seq_ev_is_direct(event);
    613
    614	dest = get_event_dest_client(event, filter);
    615	if (dest == NULL)
    616		goto __skip;
    617	dest_port = snd_seq_port_use_ptr(dest, event->dest.port);
    618	if (dest_port == NULL)
    619		goto __skip;
    620
    621	/* check permission */
    622	if (! check_port_perm(dest_port, SNDRV_SEQ_PORT_CAP_WRITE)) {
    623		result = -EPERM;
    624		goto __skip;
    625	}
    626		
    627	if (dest_port->timestamping)
    628		update_timestamp_of_queue(event, dest_port->time_queue,
    629					  dest_port->time_real);
    630
    631	switch (dest->type) {
    632	case USER_CLIENT:
    633		if (dest->data.user.fifo)
    634			result = snd_seq_fifo_event_in(dest->data.user.fifo, event);
    635		break;
    636
    637	case KERNEL_CLIENT:
    638		if (dest_port->event_input == NULL)
    639			break;
    640		result = dest_port->event_input(event, direct,
    641						dest_port->private_data,
    642						atomic, hop);
    643		break;
    644	default:
    645		break;
    646	}
    647
    648  __skip:
    649	if (dest_port)
    650		snd_seq_port_unlock(dest_port);
    651	if (dest)
    652		snd_seq_client_unlock(dest);
    653
    654	if (result < 0 && !direct) {
    655		result = bounce_error_event(client, event, result, atomic, hop);
    656	}
    657	return result;
    658}
    659
    660
    661/*
    662 * send the event to all subscribers:
    663 */
    664static int deliver_to_subscribers(struct snd_seq_client *client,
    665				  struct snd_seq_event *event,
    666				  int atomic, int hop)
    667{
    668	struct snd_seq_subscribers *subs;
    669	int err, result = 0, num_ev = 0;
    670	struct snd_seq_event event_saved;
    671	struct snd_seq_client_port *src_port;
    672	struct snd_seq_port_subs_info *grp;
    673
    674	src_port = snd_seq_port_use_ptr(client, event->source.port);
    675	if (src_port == NULL)
    676		return -EINVAL; /* invalid source port */
    677	/* save original event record */
    678	event_saved = *event;
    679	grp = &src_port->c_src;
    680	
    681	/* lock list */
    682	if (atomic)
    683		read_lock(&grp->list_lock);
    684	else
    685		down_read_nested(&grp->list_mutex, hop);
    686	list_for_each_entry(subs, &grp->list_head, src_list) {
    687		/* both ports ready? */
    688		if (atomic_read(&subs->ref_count) != 2)
    689			continue;
    690		event->dest = subs->info.dest;
    691		if (subs->info.flags & SNDRV_SEQ_PORT_SUBS_TIMESTAMP)
    692			/* convert time according to flag with subscription */
    693			update_timestamp_of_queue(event, subs->info.queue,
    694						  subs->info.flags & SNDRV_SEQ_PORT_SUBS_TIME_REAL);
    695		err = snd_seq_deliver_single_event(client, event,
    696						   0, atomic, hop);
    697		if (err < 0) {
    698			/* save first error that occurs and continue */
    699			if (!result)
    700				result = err;
    701			continue;
    702		}
    703		num_ev++;
    704		/* restore original event record */
    705		*event = event_saved;
    706	}
    707	if (atomic)
    708		read_unlock(&grp->list_lock);
    709	else
    710		up_read(&grp->list_mutex);
    711	*event = event_saved; /* restore */
    712	snd_seq_port_unlock(src_port);
    713	return (result < 0) ? result : num_ev;
    714}
    715
    716
    717#ifdef SUPPORT_BROADCAST 
    718/*
    719 * broadcast to all ports:
    720 */
    721static int port_broadcast_event(struct snd_seq_client *client,
    722				struct snd_seq_event *event,
    723				int atomic, int hop)
    724{
    725	int num_ev = 0, err, result = 0;
    726	struct snd_seq_client *dest_client;
    727	struct snd_seq_client_port *port;
    728
    729	dest_client = get_event_dest_client(event, SNDRV_SEQ_FILTER_BROADCAST);
    730	if (dest_client == NULL)
    731		return 0; /* no matching destination */
    732
    733	read_lock(&dest_client->ports_lock);
    734	list_for_each_entry(port, &dest_client->ports_list_head, list) {
    735		event->dest.port = port->addr.port;
    736		/* pass NULL as source client to avoid error bounce */
    737		err = snd_seq_deliver_single_event(NULL, event,
    738						   SNDRV_SEQ_FILTER_BROADCAST,
    739						   atomic, hop);
    740		if (err < 0) {
    741			/* save first error that occurs and continue */
    742			if (!result)
    743				result = err;
    744			continue;
    745		}
    746		num_ev++;
    747	}
    748	read_unlock(&dest_client->ports_lock);
    749	snd_seq_client_unlock(dest_client);
    750	event->dest.port = SNDRV_SEQ_ADDRESS_BROADCAST; /* restore */
    751	return (result < 0) ? result : num_ev;
    752}
    753
    754/*
    755 * send the event to all clients:
    756 * if destination port is also ADDRESS_BROADCAST, deliver to all ports.
    757 */
    758static int broadcast_event(struct snd_seq_client *client,
    759			   struct snd_seq_event *event, int atomic, int hop)
    760{
    761	int err, result = 0, num_ev = 0;
    762	int dest;
    763	struct snd_seq_addr addr;
    764
    765	addr = event->dest; /* save */
    766
    767	for (dest = 0; dest < SNDRV_SEQ_MAX_CLIENTS; dest++) {
    768		/* don't send to itself */
    769		if (dest == client->number)
    770			continue;
    771		event->dest.client = dest;
    772		event->dest.port = addr.port;
    773		if (addr.port == SNDRV_SEQ_ADDRESS_BROADCAST)
    774			err = port_broadcast_event(client, event, atomic, hop);
    775		else
    776			/* pass NULL as source client to avoid error bounce */
    777			err = snd_seq_deliver_single_event(NULL, event,
    778							   SNDRV_SEQ_FILTER_BROADCAST,
    779							   atomic, hop);
    780		if (err < 0) {
    781			/* save first error that occurs and continue */
    782			if (!result)
    783				result = err;
    784			continue;
    785		}
    786		num_ev += err;
    787	}
    788	event->dest = addr; /* restore */
    789	return (result < 0) ? result : num_ev;
    790}
    791
    792
    793/* multicast - not supported yet */
    794static int multicast_event(struct snd_seq_client *client, struct snd_seq_event *event,
    795			   int atomic, int hop)
    796{
    797	pr_debug("ALSA: seq: multicast not supported yet.\n");
    798	return 0; /* ignored */
    799}
    800#endif /* SUPPORT_BROADCAST */
    801
    802
    803/* deliver an event to the destination port(s).
    804 * if the event is to subscribers or broadcast, the event is dispatched
    805 * to multiple targets.
    806 *
    807 * RETURN VALUE: n > 0  : the number of delivered events.
    808 *               n == 0 : the event was not passed to any client.
    809 *               n < 0  : error - event was not processed.
    810 */
    811static int snd_seq_deliver_event(struct snd_seq_client *client, struct snd_seq_event *event,
    812				 int atomic, int hop)
    813{
    814	int result;
    815
    816	hop++;
    817	if (hop >= SNDRV_SEQ_MAX_HOPS) {
    818		pr_debug("ALSA: seq: too long delivery path (%d:%d->%d:%d)\n",
    819			   event->source.client, event->source.port,
    820			   event->dest.client, event->dest.port);
    821		return -EMLINK;
    822	}
    823
    824	if (snd_seq_ev_is_variable(event) &&
    825	    snd_BUG_ON(atomic && (event->data.ext.len & SNDRV_SEQ_EXT_USRPTR)))
    826		return -EINVAL;
    827
    828	if (event->queue == SNDRV_SEQ_ADDRESS_SUBSCRIBERS ||
    829	    event->dest.client == SNDRV_SEQ_ADDRESS_SUBSCRIBERS)
    830		result = deliver_to_subscribers(client, event, atomic, hop);
    831#ifdef SUPPORT_BROADCAST
    832	else if (event->queue == SNDRV_SEQ_ADDRESS_BROADCAST ||
    833		 event->dest.client == SNDRV_SEQ_ADDRESS_BROADCAST)
    834		result = broadcast_event(client, event, atomic, hop);
    835	else if (event->dest.client >= SNDRV_SEQ_MAX_CLIENTS)
    836		result = multicast_event(client, event, atomic, hop);
    837	else if (event->dest.port == SNDRV_SEQ_ADDRESS_BROADCAST)
    838		result = port_broadcast_event(client, event, atomic, hop);
    839#endif
    840	else
    841		result = snd_seq_deliver_single_event(client, event, 0, atomic, hop);
    842
    843	return result;
    844}
    845
    846/*
    847 * dispatch an event cell:
    848 * This function is called only from queue check routines in timer
    849 * interrupts or after enqueued.
    850 * The event cell shall be released or re-queued in this function.
    851 *
    852 * RETURN VALUE: n > 0  : the number of delivered events.
    853 *		 n == 0 : the event was not passed to any client.
    854 *		 n < 0  : error - event was not processed.
    855 */
    856int snd_seq_dispatch_event(struct snd_seq_event_cell *cell, int atomic, int hop)
    857{
    858	struct snd_seq_client *client;
    859	int result;
    860
    861	if (snd_BUG_ON(!cell))
    862		return -EINVAL;
    863
    864	client = snd_seq_client_use_ptr(cell->event.source.client);
    865	if (client == NULL) {
    866		snd_seq_cell_free(cell); /* release this cell */
    867		return -EINVAL;
    868	}
    869
    870	if (cell->event.type == SNDRV_SEQ_EVENT_NOTE) {
    871		/* NOTE event:
    872		 * the event cell is re-used as a NOTE-OFF event and
    873		 * enqueued again.
    874		 */
    875		struct snd_seq_event tmpev, *ev;
    876
    877		/* reserve this event to enqueue note-off later */
    878		tmpev = cell->event;
    879		tmpev.type = SNDRV_SEQ_EVENT_NOTEON;
    880		result = snd_seq_deliver_event(client, &tmpev, atomic, hop);
    881
    882		/*
    883		 * This was originally a note event.  We now re-use the
    884		 * cell for the note-off event.
    885		 */
    886
    887		ev = &cell->event;
    888		ev->type = SNDRV_SEQ_EVENT_NOTEOFF;
    889		ev->flags |= SNDRV_SEQ_PRIORITY_HIGH;
    890
    891		/* add the duration time */
    892		switch (ev->flags & SNDRV_SEQ_TIME_STAMP_MASK) {
    893		case SNDRV_SEQ_TIME_STAMP_TICK:
    894			ev->time.tick += ev->data.note.duration;
    895			break;
    896		case SNDRV_SEQ_TIME_STAMP_REAL:
    897			/* unit for duration is ms */
    898			ev->time.time.tv_nsec += 1000000 * (ev->data.note.duration % 1000);
    899			ev->time.time.tv_sec += ev->data.note.duration / 1000 +
    900						ev->time.time.tv_nsec / 1000000000;
    901			ev->time.time.tv_nsec %= 1000000000;
    902			break;
    903		}
    904		ev->data.note.velocity = ev->data.note.off_velocity;
    905
    906		/* Now queue this cell as the note off event */
    907		if (snd_seq_enqueue_event(cell, atomic, hop) < 0)
    908			snd_seq_cell_free(cell); /* release this cell */
    909
    910	} else {
    911		/* Normal events:
    912		 * event cell is freed after processing the event
    913		 */
    914
    915		result = snd_seq_deliver_event(client, &cell->event, atomic, hop);
    916		snd_seq_cell_free(cell);
    917	}
    918
    919	snd_seq_client_unlock(client);
    920	return result;
    921}
    922
    923
    924/* Allocate a cell from client pool and enqueue it to queue:
    925 * if pool is empty and blocking is TRUE, sleep until a new cell is
    926 * available.
    927 */
    928static int snd_seq_client_enqueue_event(struct snd_seq_client *client,
    929					struct snd_seq_event *event,
    930					struct file *file, int blocking,
    931					int atomic, int hop,
    932					struct mutex *mutexp)
    933{
    934	struct snd_seq_event_cell *cell;
    935	int err;
    936
    937	/* special queue values - force direct passing */
    938	if (event->queue == SNDRV_SEQ_ADDRESS_SUBSCRIBERS) {
    939		event->dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
    940		event->queue = SNDRV_SEQ_QUEUE_DIRECT;
    941	} else
    942#ifdef SUPPORT_BROADCAST
    943		if (event->queue == SNDRV_SEQ_ADDRESS_BROADCAST) {
    944			event->dest.client = SNDRV_SEQ_ADDRESS_BROADCAST;
    945			event->queue = SNDRV_SEQ_QUEUE_DIRECT;
    946		}
    947#endif
    948	if (event->dest.client == SNDRV_SEQ_ADDRESS_SUBSCRIBERS) {
    949		/* check presence of source port */
    950		struct snd_seq_client_port *src_port = snd_seq_port_use_ptr(client, event->source.port);
    951		if (src_port == NULL)
    952			return -EINVAL;
    953		snd_seq_port_unlock(src_port);
    954	}
    955
    956	/* direct event processing without enqueued */
    957	if (snd_seq_ev_is_direct(event)) {
    958		if (event->type == SNDRV_SEQ_EVENT_NOTE)
    959			return -EINVAL; /* this event must be enqueued! */
    960		return snd_seq_deliver_event(client, event, atomic, hop);
    961	}
    962
    963	/* Not direct, normal queuing */
    964	if (snd_seq_queue_is_used(event->queue, client->number) <= 0)
    965		return -EINVAL;  /* invalid queue */
    966	if (! snd_seq_write_pool_allocated(client))
    967		return -ENXIO; /* queue is not allocated */
    968
    969	/* allocate an event cell */
    970	err = snd_seq_event_dup(client->pool, event, &cell, !blocking || atomic,
    971				file, mutexp);
    972	if (err < 0)
    973		return err;
    974
    975	/* we got a cell. enqueue it. */
    976	err = snd_seq_enqueue_event(cell, atomic, hop);
    977	if (err < 0) {
    978		snd_seq_cell_free(cell);
    979		return err;
    980	}
    981
    982	return 0;
    983}
    984
    985
    986/*
    987 * check validity of event type and data length.
    988 * return non-zero if invalid.
    989 */
    990static int check_event_type_and_length(struct snd_seq_event *ev)
    991{
    992	switch (snd_seq_ev_length_type(ev)) {
    993	case SNDRV_SEQ_EVENT_LENGTH_FIXED:
    994		if (snd_seq_ev_is_variable_type(ev))
    995			return -EINVAL;
    996		break;
    997	case SNDRV_SEQ_EVENT_LENGTH_VARIABLE:
    998		if (! snd_seq_ev_is_variable_type(ev) ||
    999		    (ev->data.ext.len & ~SNDRV_SEQ_EXT_MASK) >= SNDRV_SEQ_MAX_EVENT_LEN)
   1000			return -EINVAL;
   1001		break;
   1002	case SNDRV_SEQ_EVENT_LENGTH_VARUSR:
   1003		if (! snd_seq_ev_is_direct(ev))
   1004			return -EINVAL;
   1005		break;
   1006	}
   1007	return 0;
   1008}
   1009
   1010
   1011/* handle write() */
   1012/* possible error values:
   1013 *	-ENXIO	invalid client or file open mode
   1014 *	-ENOMEM	malloc failed
   1015 *	-EFAULT	seg. fault during copy from user space
   1016 *	-EINVAL	invalid event
   1017 *	-EAGAIN	no space in output pool
   1018 *	-EINTR	interrupts while sleep
   1019 *	-EMLINK	too many hops
   1020 *	others	depends on return value from driver callback
   1021 */
   1022static ssize_t snd_seq_write(struct file *file, const char __user *buf,
   1023			     size_t count, loff_t *offset)
   1024{
   1025	struct snd_seq_client *client = file->private_data;
   1026	int written = 0, len;
   1027	int err, handled;
   1028	struct snd_seq_event event;
   1029
   1030	if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT))
   1031		return -ENXIO;
   1032
   1033	/* check client structures are in place */
   1034	if (snd_BUG_ON(!client))
   1035		return -ENXIO;
   1036		
   1037	if (!client->accept_output || client->pool == NULL)
   1038		return -ENXIO;
   1039
   1040 repeat:
   1041	handled = 0;
   1042	/* allocate the pool now if the pool is not allocated yet */ 
   1043	mutex_lock(&client->ioctl_mutex);
   1044	if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) {
   1045		err = snd_seq_pool_init(client->pool);
   1046		if (err < 0)
   1047			goto out;
   1048	}
   1049
   1050	/* only process whole events */
   1051	err = -EINVAL;
   1052	while (count >= sizeof(struct snd_seq_event)) {
   1053		/* Read in the event header from the user */
   1054		len = sizeof(event);
   1055		if (copy_from_user(&event, buf, len)) {
   1056			err = -EFAULT;
   1057			break;
   1058		}
   1059		event.source.client = client->number;	/* fill in client number */
   1060		/* Check for extension data length */
   1061		if (check_event_type_and_length(&event)) {
   1062			err = -EINVAL;
   1063			break;
   1064		}
   1065
   1066		/* check for special events */
   1067		if (event.type == SNDRV_SEQ_EVENT_NONE)
   1068			goto __skip_event;
   1069		else if (snd_seq_ev_is_reserved(&event)) {
   1070			err = -EINVAL;
   1071			break;
   1072		}
   1073
   1074		if (snd_seq_ev_is_variable(&event)) {
   1075			int extlen = event.data.ext.len & ~SNDRV_SEQ_EXT_MASK;
   1076			if ((size_t)(extlen + len) > count) {
   1077				/* back out, will get an error this time or next */
   1078				err = -EINVAL;
   1079				break;
   1080			}
   1081			/* set user space pointer */
   1082			event.data.ext.len = extlen | SNDRV_SEQ_EXT_USRPTR;
   1083			event.data.ext.ptr = (char __force *)buf
   1084						+ sizeof(struct snd_seq_event);
   1085			len += extlen; /* increment data length */
   1086		} else {
   1087#ifdef CONFIG_COMPAT
   1088			if (client->convert32 && snd_seq_ev_is_varusr(&event)) {
   1089				void *ptr = (void __force *)compat_ptr(event.data.raw32.d[1]);
   1090				event.data.ext.ptr = ptr;
   1091			}
   1092#endif
   1093		}
   1094
   1095		/* ok, enqueue it */
   1096		err = snd_seq_client_enqueue_event(client, &event, file,
   1097						   !(file->f_flags & O_NONBLOCK),
   1098						   0, 0, &client->ioctl_mutex);
   1099		if (err < 0)
   1100			break;
   1101		handled++;
   1102
   1103	__skip_event:
   1104		/* Update pointers and counts */
   1105		count -= len;
   1106		buf += len;
   1107		written += len;
   1108
   1109		/* let's have a coffee break if too many events are queued */
   1110		if (++handled >= 200) {
   1111			mutex_unlock(&client->ioctl_mutex);
   1112			goto repeat;
   1113		}
   1114	}
   1115
   1116 out:
   1117	mutex_unlock(&client->ioctl_mutex);
   1118	return written ? written : err;
   1119}
   1120
   1121
   1122/*
   1123 * handle polling
   1124 */
   1125static __poll_t snd_seq_poll(struct file *file, poll_table * wait)
   1126{
   1127	struct snd_seq_client *client = file->private_data;
   1128	__poll_t mask = 0;
   1129
   1130	/* check client structures are in place */
   1131	if (snd_BUG_ON(!client))
   1132		return EPOLLERR;
   1133
   1134	if ((snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_INPUT) &&
   1135	    client->data.user.fifo) {
   1136
   1137		/* check if data is available in the outqueue */
   1138		if (snd_seq_fifo_poll_wait(client->data.user.fifo, file, wait))
   1139			mask |= EPOLLIN | EPOLLRDNORM;
   1140	}
   1141
   1142	if (snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT) {
   1143
   1144		/* check if data is available in the pool */
   1145		if (!snd_seq_write_pool_allocated(client) ||
   1146		    snd_seq_pool_poll_wait(client->pool, file, wait))
   1147			mask |= EPOLLOUT | EPOLLWRNORM;
   1148	}
   1149
   1150	return mask;
   1151}
   1152
   1153
   1154/*-----------------------------------------------------*/
   1155
   1156static int snd_seq_ioctl_pversion(struct snd_seq_client *client, void *arg)
   1157{
   1158	int *pversion = arg;
   1159
   1160	*pversion = SNDRV_SEQ_VERSION;
   1161	return 0;
   1162}
   1163
   1164static int snd_seq_ioctl_client_id(struct snd_seq_client *client, void *arg)
   1165{
   1166	int *client_id = arg;
   1167
   1168	*client_id = client->number;
   1169	return 0;
   1170}
   1171
   1172/* SYSTEM_INFO ioctl() */
   1173static int snd_seq_ioctl_system_info(struct snd_seq_client *client, void *arg)
   1174{
   1175	struct snd_seq_system_info *info = arg;
   1176
   1177	memset(info, 0, sizeof(*info));
   1178	/* fill the info fields */
   1179	info->queues = SNDRV_SEQ_MAX_QUEUES;
   1180	info->clients = SNDRV_SEQ_MAX_CLIENTS;
   1181	info->ports = SNDRV_SEQ_MAX_PORTS;
   1182	info->channels = 256;	/* fixed limit */
   1183	info->cur_clients = client_usage.cur;
   1184	info->cur_queues = snd_seq_queue_get_cur_queues();
   1185
   1186	return 0;
   1187}
   1188
   1189
   1190/* RUNNING_MODE ioctl() */
   1191static int snd_seq_ioctl_running_mode(struct snd_seq_client *client, void  *arg)
   1192{
   1193	struct snd_seq_running_info *info = arg;
   1194	struct snd_seq_client *cptr;
   1195	int err = 0;
   1196
   1197	/* requested client number */
   1198	cptr = snd_seq_client_use_ptr(info->client);
   1199	if (cptr == NULL)
   1200		return -ENOENT;		/* don't change !!! */
   1201
   1202#ifdef SNDRV_BIG_ENDIAN
   1203	if (!info->big_endian) {
   1204		err = -EINVAL;
   1205		goto __err;
   1206	}
   1207#else
   1208	if (info->big_endian) {
   1209		err = -EINVAL;
   1210		goto __err;
   1211	}
   1212
   1213#endif
   1214	if (info->cpu_mode > sizeof(long)) {
   1215		err = -EINVAL;
   1216		goto __err;
   1217	}
   1218	cptr->convert32 = (info->cpu_mode < sizeof(long));
   1219 __err:
   1220	snd_seq_client_unlock(cptr);
   1221	return err;
   1222}
   1223
   1224/* CLIENT_INFO ioctl() */
   1225static void get_client_info(struct snd_seq_client *cptr,
   1226			    struct snd_seq_client_info *info)
   1227{
   1228	info->client = cptr->number;
   1229
   1230	/* fill the info fields */
   1231	info->type = cptr->type;
   1232	strcpy(info->name, cptr->name);
   1233	info->filter = cptr->filter;
   1234	info->event_lost = cptr->event_lost;
   1235	memcpy(info->event_filter, cptr->event_filter, 32);
   1236	info->num_ports = cptr->num_ports;
   1237
   1238	if (cptr->type == USER_CLIENT)
   1239		info->pid = pid_vnr(cptr->data.user.owner);
   1240	else
   1241		info->pid = -1;
   1242
   1243	if (cptr->type == KERNEL_CLIENT)
   1244		info->card = cptr->data.kernel.card ? cptr->data.kernel.card->number : -1;
   1245	else
   1246		info->card = -1;
   1247
   1248	memset(info->reserved, 0, sizeof(info->reserved));
   1249}
   1250
   1251static int snd_seq_ioctl_get_client_info(struct snd_seq_client *client,
   1252					 void *arg)
   1253{
   1254	struct snd_seq_client_info *client_info = arg;
   1255	struct snd_seq_client *cptr;
   1256
   1257	/* requested client number */
   1258	cptr = snd_seq_client_use_ptr(client_info->client);
   1259	if (cptr == NULL)
   1260		return -ENOENT;		/* don't change !!! */
   1261
   1262	get_client_info(cptr, client_info);
   1263	snd_seq_client_unlock(cptr);
   1264
   1265	return 0;
   1266}
   1267
   1268
   1269/* CLIENT_INFO ioctl() */
   1270static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client,
   1271					 void *arg)
   1272{
   1273	struct snd_seq_client_info *client_info = arg;
   1274
   1275	/* it is not allowed to set the info fields for an another client */
   1276	if (client->number != client_info->client)
   1277		return -EPERM;
   1278	/* also client type must be set now */
   1279	if (client->type != client_info->type)
   1280		return -EINVAL;
   1281
   1282	/* fill the info fields */
   1283	if (client_info->name[0])
   1284		strscpy(client->name, client_info->name, sizeof(client->name));
   1285
   1286	client->filter = client_info->filter;
   1287	client->event_lost = client_info->event_lost;
   1288	memcpy(client->event_filter, client_info->event_filter, 32);
   1289
   1290	return 0;
   1291}
   1292
   1293
   1294/* 
   1295 * CREATE PORT ioctl() 
   1296 */
   1297static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg)
   1298{
   1299	struct snd_seq_port_info *info = arg;
   1300	struct snd_seq_client_port *port;
   1301	struct snd_seq_port_callback *callback;
   1302	int port_idx;
   1303
   1304	/* it is not allowed to create the port for an another client */
   1305	if (info->addr.client != client->number)
   1306		return -EPERM;
   1307
   1308	port = snd_seq_create_port(client, (info->flags & SNDRV_SEQ_PORT_FLG_GIVEN_PORT) ? info->addr.port : -1);
   1309	if (port == NULL)
   1310		return -ENOMEM;
   1311
   1312	if (client->type == USER_CLIENT && info->kernel) {
   1313		port_idx = port->addr.port;
   1314		snd_seq_port_unlock(port);
   1315		snd_seq_delete_port(client, port_idx);
   1316		return -EINVAL;
   1317	}
   1318	if (client->type == KERNEL_CLIENT) {
   1319		callback = info->kernel;
   1320		if (callback) {
   1321			if (callback->owner)
   1322				port->owner = callback->owner;
   1323			port->private_data = callback->private_data;
   1324			port->private_free = callback->private_free;
   1325			port->event_input = callback->event_input;
   1326			port->c_src.open = callback->subscribe;
   1327			port->c_src.close = callback->unsubscribe;
   1328			port->c_dest.open = callback->use;
   1329			port->c_dest.close = callback->unuse;
   1330		}
   1331	}
   1332
   1333	info->addr = port->addr;
   1334
   1335	snd_seq_set_port_info(port, info);
   1336	snd_seq_system_client_ev_port_start(port->addr.client, port->addr.port);
   1337	snd_seq_port_unlock(port);
   1338
   1339	return 0;
   1340}
   1341
   1342/* 
   1343 * DELETE PORT ioctl() 
   1344 */
   1345static int snd_seq_ioctl_delete_port(struct snd_seq_client *client, void *arg)
   1346{
   1347	struct snd_seq_port_info *info = arg;
   1348	int err;
   1349
   1350	/* it is not allowed to remove the port for an another client */
   1351	if (info->addr.client != client->number)
   1352		return -EPERM;
   1353
   1354	err = snd_seq_delete_port(client, info->addr.port);
   1355	if (err >= 0)
   1356		snd_seq_system_client_ev_port_exit(client->number, info->addr.port);
   1357	return err;
   1358}
   1359
   1360
   1361/* 
   1362 * GET_PORT_INFO ioctl() (on any client) 
   1363 */
   1364static int snd_seq_ioctl_get_port_info(struct snd_seq_client *client, void *arg)
   1365{
   1366	struct snd_seq_port_info *info = arg;
   1367	struct snd_seq_client *cptr;
   1368	struct snd_seq_client_port *port;
   1369
   1370	cptr = snd_seq_client_use_ptr(info->addr.client);
   1371	if (cptr == NULL)
   1372		return -ENXIO;
   1373
   1374	port = snd_seq_port_use_ptr(cptr, info->addr.port);
   1375	if (port == NULL) {
   1376		snd_seq_client_unlock(cptr);
   1377		return -ENOENT;			/* don't change */
   1378	}
   1379
   1380	/* get port info */
   1381	snd_seq_get_port_info(port, info);
   1382	snd_seq_port_unlock(port);
   1383	snd_seq_client_unlock(cptr);
   1384
   1385	return 0;
   1386}
   1387
   1388
   1389/* 
   1390 * SET_PORT_INFO ioctl() (only ports on this/own client) 
   1391 */
   1392static int snd_seq_ioctl_set_port_info(struct snd_seq_client *client, void *arg)
   1393{
   1394	struct snd_seq_port_info *info = arg;
   1395	struct snd_seq_client_port *port;
   1396
   1397	if (info->addr.client != client->number) /* only set our own ports ! */
   1398		return -EPERM;
   1399	port = snd_seq_port_use_ptr(client, info->addr.port);
   1400	if (port) {
   1401		snd_seq_set_port_info(port, info);
   1402		snd_seq_port_unlock(port);
   1403	}
   1404	return 0;
   1405}
   1406
   1407
   1408/*
   1409 * port subscription (connection)
   1410 */
   1411#define PERM_RD		(SNDRV_SEQ_PORT_CAP_READ|SNDRV_SEQ_PORT_CAP_SUBS_READ)
   1412#define PERM_WR		(SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_SUBS_WRITE)
   1413
   1414static int check_subscription_permission(struct snd_seq_client *client,
   1415					 struct snd_seq_client_port *sport,
   1416					 struct snd_seq_client_port *dport,
   1417					 struct snd_seq_port_subscribe *subs)
   1418{
   1419	if (client->number != subs->sender.client &&
   1420	    client->number != subs->dest.client) {
   1421		/* connection by third client - check export permission */
   1422		if (check_port_perm(sport, SNDRV_SEQ_PORT_CAP_NO_EXPORT))
   1423			return -EPERM;
   1424		if (check_port_perm(dport, SNDRV_SEQ_PORT_CAP_NO_EXPORT))
   1425			return -EPERM;
   1426	}
   1427
   1428	/* check read permission */
   1429	/* if sender or receiver is the subscribing client itself,
   1430	 * no permission check is necessary
   1431	 */
   1432	if (client->number != subs->sender.client) {
   1433		if (! check_port_perm(sport, PERM_RD))
   1434			return -EPERM;
   1435	}
   1436	/* check write permission */
   1437	if (client->number != subs->dest.client) {
   1438		if (! check_port_perm(dport, PERM_WR))
   1439			return -EPERM;
   1440	}
   1441	return 0;
   1442}
   1443
   1444/*
   1445 * send an subscription notify event to user client:
   1446 * client must be user client.
   1447 */
   1448int snd_seq_client_notify_subscription(int client, int port,
   1449				       struct snd_seq_port_subscribe *info,
   1450				       int evtype)
   1451{
   1452	struct snd_seq_event event;
   1453
   1454	memset(&event, 0, sizeof(event));
   1455	event.type = evtype;
   1456	event.data.connect.dest = info->dest;
   1457	event.data.connect.sender = info->sender;
   1458
   1459	return snd_seq_system_notify(client, port, &event);  /* non-atomic */
   1460}
   1461
   1462
   1463/* 
   1464 * add to port's subscription list IOCTL interface 
   1465 */
   1466static int snd_seq_ioctl_subscribe_port(struct snd_seq_client *client,
   1467					void *arg)
   1468{
   1469	struct snd_seq_port_subscribe *subs = arg;
   1470	int result = -EINVAL;
   1471	struct snd_seq_client *receiver = NULL, *sender = NULL;
   1472	struct snd_seq_client_port *sport = NULL, *dport = NULL;
   1473
   1474	receiver = snd_seq_client_use_ptr(subs->dest.client);
   1475	if (!receiver)
   1476		goto __end;
   1477	sender = snd_seq_client_use_ptr(subs->sender.client);
   1478	if (!sender)
   1479		goto __end;
   1480	sport = snd_seq_port_use_ptr(sender, subs->sender.port);
   1481	if (!sport)
   1482		goto __end;
   1483	dport = snd_seq_port_use_ptr(receiver, subs->dest.port);
   1484	if (!dport)
   1485		goto __end;
   1486
   1487	result = check_subscription_permission(client, sport, dport, subs);
   1488	if (result < 0)
   1489		goto __end;
   1490
   1491	/* connect them */
   1492	result = snd_seq_port_connect(client, sender, sport, receiver, dport, subs);
   1493	if (! result) /* broadcast announce */
   1494		snd_seq_client_notify_subscription(SNDRV_SEQ_ADDRESS_SUBSCRIBERS, 0,
   1495						   subs, SNDRV_SEQ_EVENT_PORT_SUBSCRIBED);
   1496      __end:
   1497      	if (sport)
   1498		snd_seq_port_unlock(sport);
   1499	if (dport)
   1500		snd_seq_port_unlock(dport);
   1501	if (sender)
   1502		snd_seq_client_unlock(sender);
   1503	if (receiver)
   1504		snd_seq_client_unlock(receiver);
   1505	return result;
   1506}
   1507
   1508
   1509/* 
   1510 * remove from port's subscription list 
   1511 */
   1512static int snd_seq_ioctl_unsubscribe_port(struct snd_seq_client *client,
   1513					  void *arg)
   1514{
   1515	struct snd_seq_port_subscribe *subs = arg;
   1516	int result = -ENXIO;
   1517	struct snd_seq_client *receiver = NULL, *sender = NULL;
   1518	struct snd_seq_client_port *sport = NULL, *dport = NULL;
   1519
   1520	receiver = snd_seq_client_use_ptr(subs->dest.client);
   1521	if (!receiver)
   1522		goto __end;
   1523	sender = snd_seq_client_use_ptr(subs->sender.client);
   1524	if (!sender)
   1525		goto __end;
   1526	sport = snd_seq_port_use_ptr(sender, subs->sender.port);
   1527	if (!sport)
   1528		goto __end;
   1529	dport = snd_seq_port_use_ptr(receiver, subs->dest.port);
   1530	if (!dport)
   1531		goto __end;
   1532
   1533	result = check_subscription_permission(client, sport, dport, subs);
   1534	if (result < 0)
   1535		goto __end;
   1536
   1537	result = snd_seq_port_disconnect(client, sender, sport, receiver, dport, subs);
   1538	if (! result) /* broadcast announce */
   1539		snd_seq_client_notify_subscription(SNDRV_SEQ_ADDRESS_SUBSCRIBERS, 0,
   1540						   subs, SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED);
   1541      __end:
   1542      	if (sport)
   1543		snd_seq_port_unlock(sport);
   1544	if (dport)
   1545		snd_seq_port_unlock(dport);
   1546	if (sender)
   1547		snd_seq_client_unlock(sender);
   1548	if (receiver)
   1549		snd_seq_client_unlock(receiver);
   1550	return result;
   1551}
   1552
   1553
   1554/* CREATE_QUEUE ioctl() */
   1555static int snd_seq_ioctl_create_queue(struct snd_seq_client *client, void *arg)
   1556{
   1557	struct snd_seq_queue_info *info = arg;
   1558	struct snd_seq_queue *q;
   1559
   1560	q = snd_seq_queue_alloc(client->number, info->locked, info->flags);
   1561	if (IS_ERR(q))
   1562		return PTR_ERR(q);
   1563
   1564	info->queue = q->queue;
   1565	info->locked = q->locked;
   1566	info->owner = q->owner;
   1567
   1568	/* set queue name */
   1569	if (!info->name[0])
   1570		snprintf(info->name, sizeof(info->name), "Queue-%d", q->queue);
   1571	strscpy(q->name, info->name, sizeof(q->name));
   1572	snd_use_lock_free(&q->use_lock);
   1573
   1574	return 0;
   1575}
   1576
   1577/* DELETE_QUEUE ioctl() */
   1578static int snd_seq_ioctl_delete_queue(struct snd_seq_client *client, void *arg)
   1579{
   1580	struct snd_seq_queue_info *info = arg;
   1581
   1582	return snd_seq_queue_delete(client->number, info->queue);
   1583}
   1584
   1585/* GET_QUEUE_INFO ioctl() */
   1586static int snd_seq_ioctl_get_queue_info(struct snd_seq_client *client,
   1587					void *arg)
   1588{
   1589	struct snd_seq_queue_info *info = arg;
   1590	struct snd_seq_queue *q;
   1591
   1592	q = queueptr(info->queue);
   1593	if (q == NULL)
   1594		return -EINVAL;
   1595
   1596	memset(info, 0, sizeof(*info));
   1597	info->queue = q->queue;
   1598	info->owner = q->owner;
   1599	info->locked = q->locked;
   1600	strscpy(info->name, q->name, sizeof(info->name));
   1601	queuefree(q);
   1602
   1603	return 0;
   1604}
   1605
   1606/* SET_QUEUE_INFO ioctl() */
   1607static int snd_seq_ioctl_set_queue_info(struct snd_seq_client *client,
   1608					void *arg)
   1609{
   1610	struct snd_seq_queue_info *info = arg;
   1611	struct snd_seq_queue *q;
   1612
   1613	if (info->owner != client->number)
   1614		return -EINVAL;
   1615
   1616	/* change owner/locked permission */
   1617	if (snd_seq_queue_check_access(info->queue, client->number)) {
   1618		if (snd_seq_queue_set_owner(info->queue, client->number, info->locked) < 0)
   1619			return -EPERM;
   1620		if (info->locked)
   1621			snd_seq_queue_use(info->queue, client->number, 1);
   1622	} else {
   1623		return -EPERM;
   1624	}	
   1625
   1626	q = queueptr(info->queue);
   1627	if (! q)
   1628		return -EINVAL;
   1629	if (q->owner != client->number) {
   1630		queuefree(q);
   1631		return -EPERM;
   1632	}
   1633	strscpy(q->name, info->name, sizeof(q->name));
   1634	queuefree(q);
   1635
   1636	return 0;
   1637}
   1638
   1639/* GET_NAMED_QUEUE ioctl() */
   1640static int snd_seq_ioctl_get_named_queue(struct snd_seq_client *client,
   1641					 void *arg)
   1642{
   1643	struct snd_seq_queue_info *info = arg;
   1644	struct snd_seq_queue *q;
   1645
   1646	q = snd_seq_queue_find_name(info->name);
   1647	if (q == NULL)
   1648		return -EINVAL;
   1649	info->queue = q->queue;
   1650	info->owner = q->owner;
   1651	info->locked = q->locked;
   1652	queuefree(q);
   1653
   1654	return 0;
   1655}
   1656
   1657/* GET_QUEUE_STATUS ioctl() */
   1658static int snd_seq_ioctl_get_queue_status(struct snd_seq_client *client,
   1659					  void *arg)
   1660{
   1661	struct snd_seq_queue_status *status = arg;
   1662	struct snd_seq_queue *queue;
   1663	struct snd_seq_timer *tmr;
   1664
   1665	queue = queueptr(status->queue);
   1666	if (queue == NULL)
   1667		return -EINVAL;
   1668	memset(status, 0, sizeof(*status));
   1669	status->queue = queue->queue;
   1670	
   1671	tmr = queue->timer;
   1672	status->events = queue->tickq->cells + queue->timeq->cells;
   1673
   1674	status->time = snd_seq_timer_get_cur_time(tmr, true);
   1675	status->tick = snd_seq_timer_get_cur_tick(tmr);
   1676
   1677	status->running = tmr->running;
   1678
   1679	status->flags = queue->flags;
   1680	queuefree(queue);
   1681
   1682	return 0;
   1683}
   1684
   1685
   1686/* GET_QUEUE_TEMPO ioctl() */
   1687static int snd_seq_ioctl_get_queue_tempo(struct snd_seq_client *client,
   1688					 void *arg)
   1689{
   1690	struct snd_seq_queue_tempo *tempo = arg;
   1691	struct snd_seq_queue *queue;
   1692	struct snd_seq_timer *tmr;
   1693
   1694	queue = queueptr(tempo->queue);
   1695	if (queue == NULL)
   1696		return -EINVAL;
   1697	memset(tempo, 0, sizeof(*tempo));
   1698	tempo->queue = queue->queue;
   1699	
   1700	tmr = queue->timer;
   1701
   1702	tempo->tempo = tmr->tempo;
   1703	tempo->ppq = tmr->ppq;
   1704	tempo->skew_value = tmr->skew;
   1705	tempo->skew_base = tmr->skew_base;
   1706	queuefree(queue);
   1707
   1708	return 0;
   1709}
   1710
   1711
   1712/* SET_QUEUE_TEMPO ioctl() */
   1713int snd_seq_set_queue_tempo(int client, struct snd_seq_queue_tempo *tempo)
   1714{
   1715	if (!snd_seq_queue_check_access(tempo->queue, client))
   1716		return -EPERM;
   1717	return snd_seq_queue_timer_set_tempo(tempo->queue, client, tempo);
   1718}
   1719EXPORT_SYMBOL(snd_seq_set_queue_tempo);
   1720
   1721static int snd_seq_ioctl_set_queue_tempo(struct snd_seq_client *client,
   1722					 void *arg)
   1723{
   1724	struct snd_seq_queue_tempo *tempo = arg;
   1725	int result;
   1726
   1727	result = snd_seq_set_queue_tempo(client->number, tempo);
   1728	return result < 0 ? result : 0;
   1729}
   1730
   1731
   1732/* GET_QUEUE_TIMER ioctl() */
   1733static int snd_seq_ioctl_get_queue_timer(struct snd_seq_client *client,
   1734					 void *arg)
   1735{
   1736	struct snd_seq_queue_timer *timer = arg;
   1737	struct snd_seq_queue *queue;
   1738	struct snd_seq_timer *tmr;
   1739
   1740	queue = queueptr(timer->queue);
   1741	if (queue == NULL)
   1742		return -EINVAL;
   1743
   1744	mutex_lock(&queue->timer_mutex);
   1745	tmr = queue->timer;
   1746	memset(timer, 0, sizeof(*timer));
   1747	timer->queue = queue->queue;
   1748
   1749	timer->type = tmr->type;
   1750	if (tmr->type == SNDRV_SEQ_TIMER_ALSA) {
   1751		timer->u.alsa.id = tmr->alsa_id;
   1752		timer->u.alsa.resolution = tmr->preferred_resolution;
   1753	}
   1754	mutex_unlock(&queue->timer_mutex);
   1755	queuefree(queue);
   1756	
   1757	return 0;
   1758}
   1759
   1760
   1761/* SET_QUEUE_TIMER ioctl() */
   1762static int snd_seq_ioctl_set_queue_timer(struct snd_seq_client *client,
   1763					 void *arg)
   1764{
   1765	struct snd_seq_queue_timer *timer = arg;
   1766	int result = 0;
   1767
   1768	if (timer->type != SNDRV_SEQ_TIMER_ALSA)
   1769		return -EINVAL;
   1770
   1771	if (snd_seq_queue_check_access(timer->queue, client->number)) {
   1772		struct snd_seq_queue *q;
   1773		struct snd_seq_timer *tmr;
   1774
   1775		q = queueptr(timer->queue);
   1776		if (q == NULL)
   1777			return -ENXIO;
   1778		mutex_lock(&q->timer_mutex);
   1779		tmr = q->timer;
   1780		snd_seq_queue_timer_close(timer->queue);
   1781		tmr->type = timer->type;
   1782		if (tmr->type == SNDRV_SEQ_TIMER_ALSA) {
   1783			tmr->alsa_id = timer->u.alsa.id;
   1784			tmr->preferred_resolution = timer->u.alsa.resolution;
   1785		}
   1786		result = snd_seq_queue_timer_open(timer->queue);
   1787		mutex_unlock(&q->timer_mutex);
   1788		queuefree(q);
   1789	} else {
   1790		return -EPERM;
   1791	}	
   1792
   1793	return result;
   1794}
   1795
   1796
   1797/* GET_QUEUE_CLIENT ioctl() */
   1798static int snd_seq_ioctl_get_queue_client(struct snd_seq_client *client,
   1799					  void *arg)
   1800{
   1801	struct snd_seq_queue_client *info = arg;
   1802	int used;
   1803
   1804	used = snd_seq_queue_is_used(info->queue, client->number);
   1805	if (used < 0)
   1806		return -EINVAL;
   1807	info->used = used;
   1808	info->client = client->number;
   1809
   1810	return 0;
   1811}
   1812
   1813
   1814/* SET_QUEUE_CLIENT ioctl() */
   1815static int snd_seq_ioctl_set_queue_client(struct snd_seq_client *client,
   1816					  void *arg)
   1817{
   1818	struct snd_seq_queue_client *info = arg;
   1819	int err;
   1820
   1821	if (info->used >= 0) {
   1822		err = snd_seq_queue_use(info->queue, client->number, info->used);
   1823		if (err < 0)
   1824			return err;
   1825	}
   1826
   1827	return snd_seq_ioctl_get_queue_client(client, arg);
   1828}
   1829
   1830
   1831/* GET_CLIENT_POOL ioctl() */
   1832static int snd_seq_ioctl_get_client_pool(struct snd_seq_client *client,
   1833					 void *arg)
   1834{
   1835	struct snd_seq_client_pool *info = arg;
   1836	struct snd_seq_client *cptr;
   1837
   1838	cptr = snd_seq_client_use_ptr(info->client);
   1839	if (cptr == NULL)
   1840		return -ENOENT;
   1841	memset(info, 0, sizeof(*info));
   1842	info->client = cptr->number;
   1843	info->output_pool = cptr->pool->size;
   1844	info->output_room = cptr->pool->room;
   1845	info->output_free = info->output_pool;
   1846	info->output_free = snd_seq_unused_cells(cptr->pool);
   1847	if (cptr->type == USER_CLIENT) {
   1848		info->input_pool = cptr->data.user.fifo_pool_size;
   1849		info->input_free = info->input_pool;
   1850		info->input_free = snd_seq_fifo_unused_cells(cptr->data.user.fifo);
   1851	} else {
   1852		info->input_pool = 0;
   1853		info->input_free = 0;
   1854	}
   1855	snd_seq_client_unlock(cptr);
   1856	
   1857	return 0;
   1858}
   1859
   1860/* SET_CLIENT_POOL ioctl() */
   1861static int snd_seq_ioctl_set_client_pool(struct snd_seq_client *client,
   1862					 void *arg)
   1863{
   1864	struct snd_seq_client_pool *info = arg;
   1865	int rc;
   1866
   1867	if (client->number != info->client)
   1868		return -EINVAL; /* can't change other clients */
   1869
   1870	if (info->output_pool >= 1 && info->output_pool <= SNDRV_SEQ_MAX_EVENTS &&
   1871	    (! snd_seq_write_pool_allocated(client) ||
   1872	     info->output_pool != client->pool->size)) {
   1873		if (snd_seq_write_pool_allocated(client)) {
   1874			/* is the pool in use? */
   1875			if (atomic_read(&client->pool->counter))
   1876				return -EBUSY;
   1877			/* remove all existing cells */
   1878			snd_seq_pool_mark_closing(client->pool);
   1879			snd_seq_pool_done(client->pool);
   1880		}
   1881		client->pool->size = info->output_pool;
   1882		rc = snd_seq_pool_init(client->pool);
   1883		if (rc < 0)
   1884			return rc;
   1885	}
   1886	if (client->type == USER_CLIENT && client->data.user.fifo != NULL &&
   1887	    info->input_pool >= 1 &&
   1888	    info->input_pool <= SNDRV_SEQ_MAX_CLIENT_EVENTS &&
   1889	    info->input_pool != client->data.user.fifo_pool_size) {
   1890		/* change pool size */
   1891		rc = snd_seq_fifo_resize(client->data.user.fifo, info->input_pool);
   1892		if (rc < 0)
   1893			return rc;
   1894		client->data.user.fifo_pool_size = info->input_pool;
   1895	}
   1896	if (info->output_room >= 1 &&
   1897	    info->output_room <= client->pool->size) {
   1898		client->pool->room  = info->output_room;
   1899	}
   1900
   1901	return snd_seq_ioctl_get_client_pool(client, arg);
   1902}
   1903
   1904
   1905/* REMOVE_EVENTS ioctl() */
   1906static int snd_seq_ioctl_remove_events(struct snd_seq_client *client,
   1907				       void *arg)
   1908{
   1909	struct snd_seq_remove_events *info = arg;
   1910
   1911	/*
   1912	 * Input mostly not implemented XXX.
   1913	 */
   1914	if (info->remove_mode & SNDRV_SEQ_REMOVE_INPUT) {
   1915		/*
   1916		 * No restrictions so for a user client we can clear
   1917		 * the whole fifo
   1918		 */
   1919		if (client->type == USER_CLIENT && client->data.user.fifo)
   1920			snd_seq_fifo_clear(client->data.user.fifo);
   1921	}
   1922
   1923	if (info->remove_mode & SNDRV_SEQ_REMOVE_OUTPUT)
   1924		snd_seq_queue_remove_cells(client->number, info);
   1925
   1926	return 0;
   1927}
   1928
   1929
   1930/*
   1931 * get subscription info
   1932 */
   1933static int snd_seq_ioctl_get_subscription(struct snd_seq_client *client,
   1934					  void *arg)
   1935{
   1936	struct snd_seq_port_subscribe *subs = arg;
   1937	int result;
   1938	struct snd_seq_client *sender = NULL;
   1939	struct snd_seq_client_port *sport = NULL;
   1940
   1941	result = -EINVAL;
   1942	sender = snd_seq_client_use_ptr(subs->sender.client);
   1943	if (!sender)
   1944		goto __end;
   1945	sport = snd_seq_port_use_ptr(sender, subs->sender.port);
   1946	if (!sport)
   1947		goto __end;
   1948	result = snd_seq_port_get_subscription(&sport->c_src, &subs->dest,
   1949					       subs);
   1950      __end:
   1951      	if (sport)
   1952		snd_seq_port_unlock(sport);
   1953	if (sender)
   1954		snd_seq_client_unlock(sender);
   1955
   1956	return result;
   1957}
   1958
   1959
   1960/*
   1961 * get subscription info - check only its presence
   1962 */
   1963static int snd_seq_ioctl_query_subs(struct snd_seq_client *client, void *arg)
   1964{
   1965	struct snd_seq_query_subs *subs = arg;
   1966	int result = -ENXIO;
   1967	struct snd_seq_client *cptr = NULL;
   1968	struct snd_seq_client_port *port = NULL;
   1969	struct snd_seq_port_subs_info *group;
   1970	struct list_head *p;
   1971	int i;
   1972
   1973	cptr = snd_seq_client_use_ptr(subs->root.client);
   1974	if (!cptr)
   1975		goto __end;
   1976	port = snd_seq_port_use_ptr(cptr, subs->root.port);
   1977	if (!port)
   1978		goto __end;
   1979
   1980	switch (subs->type) {
   1981	case SNDRV_SEQ_QUERY_SUBS_READ:
   1982		group = &port->c_src;
   1983		break;
   1984	case SNDRV_SEQ_QUERY_SUBS_WRITE:
   1985		group = &port->c_dest;
   1986		break;
   1987	default:
   1988		goto __end;
   1989	}
   1990
   1991	down_read(&group->list_mutex);
   1992	/* search for the subscriber */
   1993	subs->num_subs = group->count;
   1994	i = 0;
   1995	result = -ENOENT;
   1996	list_for_each(p, &group->list_head) {
   1997		if (i++ == subs->index) {
   1998			/* found! */
   1999			struct snd_seq_subscribers *s;
   2000			if (subs->type == SNDRV_SEQ_QUERY_SUBS_READ) {
   2001				s = list_entry(p, struct snd_seq_subscribers, src_list);
   2002				subs->addr = s->info.dest;
   2003			} else {
   2004				s = list_entry(p, struct snd_seq_subscribers, dest_list);
   2005				subs->addr = s->info.sender;
   2006			}
   2007			subs->flags = s->info.flags;
   2008			subs->queue = s->info.queue;
   2009			result = 0;
   2010			break;
   2011		}
   2012	}
   2013	up_read(&group->list_mutex);
   2014
   2015      __end:
   2016   	if (port)
   2017		snd_seq_port_unlock(port);
   2018	if (cptr)
   2019		snd_seq_client_unlock(cptr);
   2020
   2021	return result;
   2022}
   2023
   2024
   2025/*
   2026 * query next client
   2027 */
   2028static int snd_seq_ioctl_query_next_client(struct snd_seq_client *client,
   2029					   void *arg)
   2030{
   2031	struct snd_seq_client_info *info = arg;
   2032	struct snd_seq_client *cptr = NULL;
   2033
   2034	/* search for next client */
   2035	if (info->client < INT_MAX)
   2036		info->client++;
   2037	if (info->client < 0)
   2038		info->client = 0;
   2039	for (; info->client < SNDRV_SEQ_MAX_CLIENTS; info->client++) {
   2040		cptr = snd_seq_client_use_ptr(info->client);
   2041		if (cptr)
   2042			break; /* found */
   2043	}
   2044	if (cptr == NULL)
   2045		return -ENOENT;
   2046
   2047	get_client_info(cptr, info);
   2048	snd_seq_client_unlock(cptr);
   2049
   2050	return 0;
   2051}
   2052
   2053/* 
   2054 * query next port
   2055 */
   2056static int snd_seq_ioctl_query_next_port(struct snd_seq_client *client,
   2057					 void *arg)
   2058{
   2059	struct snd_seq_port_info *info = arg;
   2060	struct snd_seq_client *cptr;
   2061	struct snd_seq_client_port *port = NULL;
   2062
   2063	cptr = snd_seq_client_use_ptr(info->addr.client);
   2064	if (cptr == NULL)
   2065		return -ENXIO;
   2066
   2067	/* search for next port */
   2068	info->addr.port++;
   2069	port = snd_seq_port_query_nearest(cptr, info);
   2070	if (port == NULL) {
   2071		snd_seq_client_unlock(cptr);
   2072		return -ENOENT;
   2073	}
   2074
   2075	/* get port info */
   2076	info->addr = port->addr;
   2077	snd_seq_get_port_info(port, info);
   2078	snd_seq_port_unlock(port);
   2079	snd_seq_client_unlock(cptr);
   2080
   2081	return 0;
   2082}
   2083
   2084/* -------------------------------------------------------- */
   2085
   2086static const struct ioctl_handler {
   2087	unsigned int cmd;
   2088	int (*func)(struct snd_seq_client *client, void *arg);
   2089} ioctl_handlers[] = {
   2090	{ SNDRV_SEQ_IOCTL_PVERSION, snd_seq_ioctl_pversion },
   2091	{ SNDRV_SEQ_IOCTL_CLIENT_ID, snd_seq_ioctl_client_id },
   2092	{ SNDRV_SEQ_IOCTL_SYSTEM_INFO, snd_seq_ioctl_system_info },
   2093	{ SNDRV_SEQ_IOCTL_RUNNING_MODE, snd_seq_ioctl_running_mode },
   2094	{ SNDRV_SEQ_IOCTL_GET_CLIENT_INFO, snd_seq_ioctl_get_client_info },
   2095	{ SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, snd_seq_ioctl_set_client_info },
   2096	{ SNDRV_SEQ_IOCTL_CREATE_PORT, snd_seq_ioctl_create_port },
   2097	{ SNDRV_SEQ_IOCTL_DELETE_PORT, snd_seq_ioctl_delete_port },
   2098	{ SNDRV_SEQ_IOCTL_GET_PORT_INFO, snd_seq_ioctl_get_port_info },
   2099	{ SNDRV_SEQ_IOCTL_SET_PORT_INFO, snd_seq_ioctl_set_port_info },
   2100	{ SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT, snd_seq_ioctl_subscribe_port },
   2101	{ SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT, snd_seq_ioctl_unsubscribe_port },
   2102	{ SNDRV_SEQ_IOCTL_CREATE_QUEUE, snd_seq_ioctl_create_queue },
   2103	{ SNDRV_SEQ_IOCTL_DELETE_QUEUE, snd_seq_ioctl_delete_queue },
   2104	{ SNDRV_SEQ_IOCTL_GET_QUEUE_INFO, snd_seq_ioctl_get_queue_info },
   2105	{ SNDRV_SEQ_IOCTL_SET_QUEUE_INFO, snd_seq_ioctl_set_queue_info },
   2106	{ SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE, snd_seq_ioctl_get_named_queue },
   2107	{ SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS, snd_seq_ioctl_get_queue_status },
   2108	{ SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO, snd_seq_ioctl_get_queue_tempo },
   2109	{ SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO, snd_seq_ioctl_set_queue_tempo },
   2110	{ SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER, snd_seq_ioctl_get_queue_timer },
   2111	{ SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, snd_seq_ioctl_set_queue_timer },
   2112	{ SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT, snd_seq_ioctl_get_queue_client },
   2113	{ SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT, snd_seq_ioctl_set_queue_client },
   2114	{ SNDRV_SEQ_IOCTL_GET_CLIENT_POOL, snd_seq_ioctl_get_client_pool },
   2115	{ SNDRV_SEQ_IOCTL_SET_CLIENT_POOL, snd_seq_ioctl_set_client_pool },
   2116	{ SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION, snd_seq_ioctl_get_subscription },
   2117	{ SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT, snd_seq_ioctl_query_next_client },
   2118	{ SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT, snd_seq_ioctl_query_next_port },
   2119	{ SNDRV_SEQ_IOCTL_REMOVE_EVENTS, snd_seq_ioctl_remove_events },
   2120	{ SNDRV_SEQ_IOCTL_QUERY_SUBS, snd_seq_ioctl_query_subs },
   2121	{ 0, NULL },
   2122};
   2123
   2124static long snd_seq_ioctl(struct file *file, unsigned int cmd,
   2125			  unsigned long arg)
   2126{
   2127	struct snd_seq_client *client = file->private_data;
   2128	/* To use kernel stack for ioctl data. */
   2129	union {
   2130		int pversion;
   2131		int client_id;
   2132		struct snd_seq_system_info	system_info;
   2133		struct snd_seq_running_info	running_info;
   2134		struct snd_seq_client_info	client_info;
   2135		struct snd_seq_port_info	port_info;
   2136		struct snd_seq_port_subscribe	port_subscribe;
   2137		struct snd_seq_queue_info	queue_info;
   2138		struct snd_seq_queue_status	queue_status;
   2139		struct snd_seq_queue_tempo	tempo;
   2140		struct snd_seq_queue_timer	queue_timer;
   2141		struct snd_seq_queue_client	queue_client;
   2142		struct snd_seq_client_pool	client_pool;
   2143		struct snd_seq_remove_events	remove_events;
   2144		struct snd_seq_query_subs	query_subs;
   2145	} buf;
   2146	const struct ioctl_handler *handler;
   2147	unsigned long size;
   2148	int err;
   2149
   2150	if (snd_BUG_ON(!client))
   2151		return -ENXIO;
   2152
   2153	for (handler = ioctl_handlers; handler->cmd > 0; ++handler) {
   2154		if (handler->cmd == cmd)
   2155			break;
   2156	}
   2157	if (handler->cmd == 0)
   2158		return -ENOTTY;
   2159
   2160	memset(&buf, 0, sizeof(buf));
   2161
   2162	/*
   2163	 * All of ioctl commands for ALSA sequencer get an argument of size
   2164	 * within 13 bits. We can safely pick up the size from the command.
   2165	 */
   2166	size = _IOC_SIZE(handler->cmd);
   2167	if (handler->cmd & IOC_IN) {
   2168		if (copy_from_user(&buf, (const void __user *)arg, size))
   2169			return -EFAULT;
   2170	}
   2171
   2172	mutex_lock(&client->ioctl_mutex);
   2173	err = handler->func(client, &buf);
   2174	mutex_unlock(&client->ioctl_mutex);
   2175	if (err >= 0) {
   2176		/* Some commands includes a bug in 'dir' field. */
   2177		if (handler->cmd == SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT ||
   2178		    handler->cmd == SNDRV_SEQ_IOCTL_SET_CLIENT_POOL ||
   2179		    (handler->cmd & IOC_OUT))
   2180			if (copy_to_user((void __user *)arg, &buf, size))
   2181				return -EFAULT;
   2182	}
   2183
   2184	return err;
   2185}
   2186
   2187#ifdef CONFIG_COMPAT
   2188#include "seq_compat.c"
   2189#else
   2190#define snd_seq_ioctl_compat	NULL
   2191#endif
   2192
   2193/* -------------------------------------------------------- */
   2194
   2195
   2196/* exported to kernel modules */
   2197int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
   2198				 const char *name_fmt, ...)
   2199{
   2200	struct snd_seq_client *client;
   2201	va_list args;
   2202
   2203	if (snd_BUG_ON(in_interrupt()))
   2204		return -EBUSY;
   2205
   2206	if (card && client_index >= SNDRV_SEQ_CLIENTS_PER_CARD)
   2207		return -EINVAL;
   2208	if (card == NULL && client_index >= SNDRV_SEQ_GLOBAL_CLIENTS)
   2209		return -EINVAL;
   2210
   2211	mutex_lock(&register_mutex);
   2212
   2213	if (card) {
   2214		client_index += SNDRV_SEQ_GLOBAL_CLIENTS
   2215			+ card->number * SNDRV_SEQ_CLIENTS_PER_CARD;
   2216		if (client_index >= SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN)
   2217			client_index = -1;
   2218	}
   2219
   2220	/* empty write queue as default */
   2221	client = seq_create_client1(client_index, 0);
   2222	if (client == NULL) {
   2223		mutex_unlock(&register_mutex);
   2224		return -EBUSY;	/* failure code */
   2225	}
   2226	usage_alloc(&client_usage, 1);
   2227
   2228	client->accept_input = 1;
   2229	client->accept_output = 1;
   2230	client->data.kernel.card = card;
   2231		
   2232	va_start(args, name_fmt);
   2233	vsnprintf(client->name, sizeof(client->name), name_fmt, args);
   2234	va_end(args);
   2235
   2236	client->type = KERNEL_CLIENT;
   2237	mutex_unlock(&register_mutex);
   2238
   2239	/* make others aware this new client */
   2240	snd_seq_system_client_ev_client_start(client->number);
   2241	
   2242	/* return client number to caller */
   2243	return client->number;
   2244}
   2245EXPORT_SYMBOL(snd_seq_create_kernel_client);
   2246
   2247/* exported to kernel modules */
   2248int snd_seq_delete_kernel_client(int client)
   2249{
   2250	struct snd_seq_client *ptr;
   2251
   2252	if (snd_BUG_ON(in_interrupt()))
   2253		return -EBUSY;
   2254
   2255	ptr = clientptr(client);
   2256	if (ptr == NULL)
   2257		return -EINVAL;
   2258
   2259	seq_free_client(ptr);
   2260	kfree(ptr);
   2261	return 0;
   2262}
   2263EXPORT_SYMBOL(snd_seq_delete_kernel_client);
   2264
   2265/*
   2266 * exported, called by kernel clients to enqueue events (w/o blocking)
   2267 *
   2268 * RETURN VALUE: zero if succeed, negative if error
   2269 */
   2270int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event *ev,
   2271				  struct file *file, bool blocking)
   2272{
   2273	struct snd_seq_client *cptr;
   2274	int result;
   2275
   2276	if (snd_BUG_ON(!ev))
   2277		return -EINVAL;
   2278
   2279	if (ev->type == SNDRV_SEQ_EVENT_NONE)
   2280		return 0; /* ignore this */
   2281	if (ev->type == SNDRV_SEQ_EVENT_KERNEL_ERROR)
   2282		return -EINVAL; /* quoted events can't be enqueued */
   2283
   2284	/* fill in client number */
   2285	ev->source.client = client;
   2286
   2287	if (check_event_type_and_length(ev))
   2288		return -EINVAL;
   2289
   2290	cptr = snd_seq_client_use_ptr(client);
   2291	if (cptr == NULL)
   2292		return -EINVAL;
   2293	
   2294	if (!cptr->accept_output) {
   2295		result = -EPERM;
   2296	} else { /* send it */
   2297		mutex_lock(&cptr->ioctl_mutex);
   2298		result = snd_seq_client_enqueue_event(cptr, ev, file, blocking,
   2299						      false, 0,
   2300						      &cptr->ioctl_mutex);
   2301		mutex_unlock(&cptr->ioctl_mutex);
   2302	}
   2303
   2304	snd_seq_client_unlock(cptr);
   2305	return result;
   2306}
   2307EXPORT_SYMBOL(snd_seq_kernel_client_enqueue);
   2308
   2309/* 
   2310 * exported, called by kernel clients to dispatch events directly to other
   2311 * clients, bypassing the queues.  Event time-stamp will be updated.
   2312 *
   2313 * RETURN VALUE: negative = delivery failed,
   2314 *		 zero, or positive: the number of delivered events
   2315 */
   2316int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event * ev,
   2317				   int atomic, int hop)
   2318{
   2319	struct snd_seq_client *cptr;
   2320	int result;
   2321
   2322	if (snd_BUG_ON(!ev))
   2323		return -EINVAL;
   2324
   2325	/* fill in client number */
   2326	ev->queue = SNDRV_SEQ_QUEUE_DIRECT;
   2327	ev->source.client = client;
   2328
   2329	if (check_event_type_and_length(ev))
   2330		return -EINVAL;
   2331
   2332	cptr = snd_seq_client_use_ptr(client);
   2333	if (cptr == NULL)
   2334		return -EINVAL;
   2335
   2336	if (!cptr->accept_output)
   2337		result = -EPERM;
   2338	else
   2339		result = snd_seq_deliver_event(cptr, ev, atomic, hop);
   2340
   2341	snd_seq_client_unlock(cptr);
   2342	return result;
   2343}
   2344EXPORT_SYMBOL(snd_seq_kernel_client_dispatch);
   2345
   2346/**
   2347 * snd_seq_kernel_client_ctl - operate a command for a client with data in
   2348 *			       kernel space.
   2349 * @clientid:	A numerical ID for a client.
   2350 * @cmd:	An ioctl(2) command for ALSA sequencer operation.
   2351 * @arg:	A pointer to data in kernel space.
   2352 *
   2353 * Against its name, both kernel/application client can be handled by this
   2354 * kernel API. A pointer of 'arg' argument should be in kernel space.
   2355 *
   2356 * Return: 0 at success. Negative error code at failure.
   2357 */
   2358int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg)
   2359{
   2360	const struct ioctl_handler *handler;
   2361	struct snd_seq_client *client;
   2362
   2363	client = clientptr(clientid);
   2364	if (client == NULL)
   2365		return -ENXIO;
   2366
   2367	for (handler = ioctl_handlers; handler->cmd > 0; ++handler) {
   2368		if (handler->cmd == cmd)
   2369			return handler->func(client, arg);
   2370	}
   2371
   2372	pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n",
   2373		 cmd, _IOC_TYPE(cmd), _IOC_NR(cmd));
   2374	return -ENOTTY;
   2375}
   2376EXPORT_SYMBOL(snd_seq_kernel_client_ctl);
   2377
   2378/* exported (for OSS emulator) */
   2379int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table *wait)
   2380{
   2381	struct snd_seq_client *client;
   2382
   2383	client = clientptr(clientid);
   2384	if (client == NULL)
   2385		return -ENXIO;
   2386
   2387	if (! snd_seq_write_pool_allocated(client))
   2388		return 1;
   2389	if (snd_seq_pool_poll_wait(client->pool, file, wait))
   2390		return 1;
   2391	return 0;
   2392}
   2393EXPORT_SYMBOL(snd_seq_kernel_client_write_poll);
   2394
   2395/*---------------------------------------------------------------------------*/
   2396
   2397#ifdef CONFIG_SND_PROC_FS
   2398/*
   2399 *  /proc interface
   2400 */
   2401static void snd_seq_info_dump_subscribers(struct snd_info_buffer *buffer,
   2402					  struct snd_seq_port_subs_info *group,
   2403					  int is_src, char *msg)
   2404{
   2405	struct list_head *p;
   2406	struct snd_seq_subscribers *s;
   2407	int count = 0;
   2408
   2409	down_read(&group->list_mutex);
   2410	if (list_empty(&group->list_head)) {
   2411		up_read(&group->list_mutex);
   2412		return;
   2413	}
   2414	snd_iprintf(buffer, msg);
   2415	list_for_each(p, &group->list_head) {
   2416		if (is_src)
   2417			s = list_entry(p, struct snd_seq_subscribers, src_list);
   2418		else
   2419			s = list_entry(p, struct snd_seq_subscribers, dest_list);
   2420		if (count++)
   2421			snd_iprintf(buffer, ", ");
   2422		snd_iprintf(buffer, "%d:%d",
   2423			    is_src ? s->info.dest.client : s->info.sender.client,
   2424			    is_src ? s->info.dest.port : s->info.sender.port);
   2425		if (s->info.flags & SNDRV_SEQ_PORT_SUBS_TIMESTAMP)
   2426			snd_iprintf(buffer, "[%c:%d]", ((s->info.flags & SNDRV_SEQ_PORT_SUBS_TIME_REAL) ? 'r' : 't'), s->info.queue);
   2427		if (group->exclusive)
   2428			snd_iprintf(buffer, "[ex]");
   2429	}
   2430	up_read(&group->list_mutex);
   2431	snd_iprintf(buffer, "\n");
   2432}
   2433
   2434#define FLAG_PERM_RD(perm) ((perm) & SNDRV_SEQ_PORT_CAP_READ ? ((perm) & SNDRV_SEQ_PORT_CAP_SUBS_READ ? 'R' : 'r') : '-')
   2435#define FLAG_PERM_WR(perm) ((perm) & SNDRV_SEQ_PORT_CAP_WRITE ? ((perm) & SNDRV_SEQ_PORT_CAP_SUBS_WRITE ? 'W' : 'w') : '-')
   2436#define FLAG_PERM_EX(perm) ((perm) & SNDRV_SEQ_PORT_CAP_NO_EXPORT ? '-' : 'e')
   2437
   2438#define FLAG_PERM_DUPLEX(perm) ((perm) & SNDRV_SEQ_PORT_CAP_DUPLEX ? 'X' : '-')
   2439
   2440static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer,
   2441				    struct snd_seq_client *client)
   2442{
   2443	struct snd_seq_client_port *p;
   2444
   2445	mutex_lock(&client->ports_mutex);
   2446	list_for_each_entry(p, &client->ports_list_head, list) {
   2447		snd_iprintf(buffer, "  Port %3d : \"%s\" (%c%c%c%c)\n",
   2448			    p->addr.port, p->name,
   2449			    FLAG_PERM_RD(p->capability),
   2450			    FLAG_PERM_WR(p->capability),
   2451			    FLAG_PERM_EX(p->capability),
   2452			    FLAG_PERM_DUPLEX(p->capability));
   2453		snd_seq_info_dump_subscribers(buffer, &p->c_src, 1, "    Connecting To: ");
   2454		snd_seq_info_dump_subscribers(buffer, &p->c_dest, 0, "    Connected From: ");
   2455	}
   2456	mutex_unlock(&client->ports_mutex);
   2457}
   2458
   2459
   2460/* exported to seq_info.c */
   2461void snd_seq_info_clients_read(struct snd_info_entry *entry, 
   2462			       struct snd_info_buffer *buffer)
   2463{
   2464	int c;
   2465	struct snd_seq_client *client;
   2466
   2467	snd_iprintf(buffer, "Client info\n");
   2468	snd_iprintf(buffer, "  cur  clients : %d\n", client_usage.cur);
   2469	snd_iprintf(buffer, "  peak clients : %d\n", client_usage.peak);
   2470	snd_iprintf(buffer, "  max  clients : %d\n", SNDRV_SEQ_MAX_CLIENTS);
   2471	snd_iprintf(buffer, "\n");
   2472
   2473	/* list the client table */
   2474	for (c = 0; c < SNDRV_SEQ_MAX_CLIENTS; c++) {
   2475		client = snd_seq_client_use_ptr(c);
   2476		if (client == NULL)
   2477			continue;
   2478		if (client->type == NO_CLIENT) {
   2479			snd_seq_client_unlock(client);
   2480			continue;
   2481		}
   2482
   2483		snd_iprintf(buffer, "Client %3d : \"%s\" [%s]\n",
   2484			    c, client->name,
   2485			    client->type == USER_CLIENT ? "User" : "Kernel");
   2486		snd_seq_info_dump_ports(buffer, client);
   2487		if (snd_seq_write_pool_allocated(client)) {
   2488			snd_iprintf(buffer, "  Output pool :\n");
   2489			snd_seq_info_pool(buffer, client->pool, "    ");
   2490		}
   2491		if (client->type == USER_CLIENT && client->data.user.fifo &&
   2492		    client->data.user.fifo->pool) {
   2493			snd_iprintf(buffer, "  Input pool :\n");
   2494			snd_seq_info_pool(buffer, client->data.user.fifo->pool, "    ");
   2495		}
   2496		snd_seq_client_unlock(client);
   2497	}
   2498}
   2499#endif /* CONFIG_SND_PROC_FS */
   2500
   2501/*---------------------------------------------------------------------------*/
   2502
   2503
   2504/*
   2505 *  REGISTRATION PART
   2506 */
   2507
   2508static const struct file_operations snd_seq_f_ops =
   2509{
   2510	.owner =	THIS_MODULE,
   2511	.read =		snd_seq_read,
   2512	.write =	snd_seq_write,
   2513	.open =		snd_seq_open,
   2514	.release =	snd_seq_release,
   2515	.llseek =	no_llseek,
   2516	.poll =		snd_seq_poll,
   2517	.unlocked_ioctl =	snd_seq_ioctl,
   2518	.compat_ioctl =	snd_seq_ioctl_compat,
   2519};
   2520
   2521static struct device seq_dev;
   2522
   2523/* 
   2524 * register sequencer device 
   2525 */
   2526int __init snd_sequencer_device_init(void)
   2527{
   2528	int err;
   2529
   2530	snd_device_initialize(&seq_dev, NULL);
   2531	dev_set_name(&seq_dev, "seq");
   2532
   2533	mutex_lock(&register_mutex);
   2534	err = snd_register_device(SNDRV_DEVICE_TYPE_SEQUENCER, NULL, 0,
   2535				  &snd_seq_f_ops, NULL, &seq_dev);
   2536	mutex_unlock(&register_mutex);
   2537	if (err < 0) {
   2538		put_device(&seq_dev);
   2539		return err;
   2540	}
   2541	
   2542	return 0;
   2543}
   2544
   2545
   2546
   2547/* 
   2548 * unregister sequencer device 
   2549 */
   2550void snd_sequencer_device_done(void)
   2551{
   2552	snd_unregister_device(&seq_dev);
   2553	put_device(&seq_dev);
   2554}