[E1000]: Fix schedule while atomic when called from mii-tool.
[safe/jmp/linux-2.6] / sound / core / seq / seq_clientmgr.c
index fd2032e..2e3fa25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  ALSA sequencer Client Manager
  *  Copyright (c) 1998-2001 by Frank van de Pol <fvdpol@coil.demon.nl>
- *                             Jaroslav Kysela <perex@suse.cz>
+ *                             Jaroslav Kysela <perex@perex.cz>
  *                             Takashi Iwai <tiwai@suse.de>
  *
  *
@@ -23,7 +23,6 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/minors.h>
@@ -67,7 +66,7 @@
 #define SNDRV_SEQ_LFLG_OPEN    (SNDRV_SEQ_LFLG_INPUT|SNDRV_SEQ_LFLG_OUTPUT)
 
 static DEFINE_SPINLOCK(clients_lock);
-static DECLARE_MUTEX(register_mutex);
+static DEFINE_MUTEX(register_mutex);
 
 /*
  * client table
@@ -237,7 +236,7 @@ static struct snd_seq_client *seq_create_client1(int client_index, int poolsize)
        client->type = NO_CLIENT;
        snd_use_lock_init(&client->use_lock);
        rwlock_init(&client->ports_lock);
-       init_MUTEX(&client->ports_mutex);
+       mutex_init(&client->ports_mutex);
        INIT_LIST_HEAD(&client->ports_list_head);
 
        /* find free slot in the client table */
@@ -290,7 +289,7 @@ static int seq_free_client1(struct snd_seq_client *client)
 
 static void seq_free_client(struct snd_seq_client * client)
 {
-       down(&register_mutex);
+       mutex_lock(&register_mutex);
        switch (client->type) {
        case NO_CLIENT:
                snd_printk(KERN_WARNING "Seq: Trying to free unused client %d\n",
@@ -306,7 +305,7 @@ static void seq_free_client(struct snd_seq_client * client)
                snd_printk(KERN_ERR "Seq: Trying to free client %d with undefined type = %d\n",
                           client->number, client->type);
        }
-       up(&register_mutex);
+       mutex_unlock(&register_mutex);
 
        snd_seq_system_client_ev_client_exit(client->number);
 }
@@ -322,11 +321,11 @@ static int snd_seq_open(struct inode *inode, struct file *file)
        struct snd_seq_client *client;
        struct snd_seq_user_client *user;
 
-       if (down_interruptible(&register_mutex))
+       if (mutex_lock_interruptible(&register_mutex))
                return -ERESTARTSYS;
        client = seq_create_client1(-1, SNDRV_SEQ_DEFAULT_EVENTS);
        if (client == NULL) {
-               up(&register_mutex);
+               mutex_unlock(&register_mutex);
                return -ENOMEM; /* failure code */
        }
 
@@ -346,14 +345,14 @@ static int snd_seq_open(struct inode *inode, struct file *file)
                if (user->fifo == NULL) {
                        seq_free_client1(client);
                        kfree(client);
-                       up(&register_mutex);
+                       mutex_unlock(&register_mutex);
                        return -ENOMEM;
                }
        }
 
        usage_alloc(&client_usage, 1);
        client->type = USER_CLIENT;
-       up(&register_mutex);
+       mutex_unlock(&register_mutex);
 
        c = client->number;
        file->private_data = client;
@@ -659,7 +658,6 @@ static int deliver_to_subscribers(struct snd_seq_client *client,
        int err = 0, num_ev = 0;
        struct snd_seq_event event_saved;
        struct snd_seq_client_port *src_port;
-       struct list_head *p;
        struct snd_seq_port_subs_info *grp;
 
        src_port = snd_seq_port_use_ptr(client, event->source.port);
@@ -674,8 +672,7 @@ static int deliver_to_subscribers(struct snd_seq_client *client,
                read_lock(&grp->list_lock);
        else
                down_read(&grp->list_mutex);
-       list_for_each(p, &grp->list_head) {
-               subs = list_entry(p, struct snd_seq_subscribers, src_list);
+       list_for_each_entry(subs, &grp->list_head, src_list) {
                event->dest = subs->info.dest;
                if (subs->info.flags & SNDRV_SEQ_PORT_SUBS_TIMESTAMP)
                        /* convert time according to flag with subscription */
@@ -709,15 +706,14 @@ static int port_broadcast_event(struct snd_seq_client *client,
 {
        int num_ev = 0, err = 0;
        struct snd_seq_client *dest_client;
-       struct list_head *p;
+       struct snd_seq_client_port *port;
 
        dest_client = get_event_dest_client(event, SNDRV_SEQ_FILTER_BROADCAST);
        if (dest_client == NULL)
                return 0; /* no matching destination */
 
        read_lock(&dest_client->ports_lock);
-       list_for_each(p, &dest_client->ports_list_head) {
-               struct snd_seq_client_port *port = list_entry(p, struct snd_seq_client_port, list);
+       list_for_each_entry(port, &dest_client->ports_list_head, list) {
                event->dest.port = port->addr.port;
                /* pass NULL as source client to avoid error bounce */
                err = snd_seq_deliver_single_event(NULL, event,
@@ -1714,6 +1710,8 @@ int snd_seq_set_queue_tempo(int client, struct snd_seq_queue_tempo *tempo)
        return snd_seq_queue_timer_set_tempo(tempo->queue, client, tempo);
 }
 
+EXPORT_SYMBOL(snd_seq_set_queue_tempo);
+
 static int snd_seq_ioctl_set_queue_tempo(struct snd_seq_client *client,
                                         void __user *arg)
 {
@@ -1743,7 +1741,7 @@ static int snd_seq_ioctl_get_queue_timer(struct snd_seq_client *client,
        if (queue == NULL)
                return -EINVAL;
 
-       if (down_interruptible(&queue->timer_mutex)) {
+       if (mutex_lock_interruptible(&queue->timer_mutex)) {
                queuefree(queue);
                return -ERESTARTSYS;
        }
@@ -1756,7 +1754,7 @@ static int snd_seq_ioctl_get_queue_timer(struct snd_seq_client *client,
                timer.u.alsa.id = tmr->alsa_id;
                timer.u.alsa.resolution = tmr->preferred_resolution;
        }
-       up(&queue->timer_mutex);
+       mutex_unlock(&queue->timer_mutex);
        queuefree(queue);
        
        if (copy_to_user(arg, &timer, sizeof(timer)))
@@ -1785,7 +1783,7 @@ static int snd_seq_ioctl_set_queue_timer(struct snd_seq_client *client,
                q = queueptr(timer.queue);
                if (q == NULL)
                        return -ENXIO;
-               if (down_interruptible(&q->timer_mutex)) {
+               if (mutex_lock_interruptible(&q->timer_mutex)) {
                        queuefree(q);
                        return -ERESTARTSYS;
                }
@@ -1797,7 +1795,7 @@ static int snd_seq_ioctl_set_queue_timer(struct snd_seq_client *client,
                        tmr->preferred_resolution = timer.u.alsa.resolution;
                }
                result = snd_seq_queue_timer_open(timer.queue);
-               up(&q->timer_mutex);
+               mutex_unlock(&q->timer_mutex);
                queuefree(q);
        } else {
                return -EPERM;
@@ -1866,8 +1864,7 @@ static int snd_seq_ioctl_get_client_pool(struct snd_seq_client *client,
        info.output_pool = cptr->pool->size;
        info.output_room = cptr->pool->room;
        info.output_free = info.output_pool;
-       if (cptr->pool)
-               info.output_free = snd_seq_unused_cells(cptr->pool);
+       info.output_free = snd_seq_unused_cells(cptr->pool);
        if (cptr->type == USER_CLIENT) {
                info.input_pool = cptr->data.user.fifo_pool_size;
                info.input_free = info.input_pool;
@@ -2230,7 +2227,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
        if (card == NULL && client_index >= SNDRV_SEQ_GLOBAL_CLIENTS)
                return -EINVAL;
 
-       if (down_interruptible(&register_mutex))
+       if (mutex_lock_interruptible(&register_mutex))
                return -ERESTARTSYS;
 
        if (card) {
@@ -2243,7 +2240,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
        /* empty write queue as default */
        client = seq_create_client1(client_index, 0);
        if (client == NULL) {
-               up(&register_mutex);
+               mutex_unlock(&register_mutex);
                return -EBUSY;  /* failure code */
        }
        usage_alloc(&client_usage, 1);
@@ -2256,7 +2253,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
        va_end(args);
 
        client->type = KERNEL_CLIENT;
-       up(&register_mutex);
+       mutex_unlock(&register_mutex);
 
        /* make others aware this new client */
        snd_seq_system_client_ev_client_start(client->number);
@@ -2265,6 +2262,8 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
        return client->number;
 }
 
+EXPORT_SYMBOL(snd_seq_create_kernel_client);
+
 /* exported to kernel modules */
 int snd_seq_delete_kernel_client(int client)
 {
@@ -2281,6 +2280,7 @@ int snd_seq_delete_kernel_client(int client)
        return 0;
 }
 
+EXPORT_SYMBOL(snd_seq_delete_kernel_client);
 
 /* skeleton to enqueue event, called from snd_seq_kernel_client_enqueue
  * and snd_seq_kernel_client_enqueue_blocking
@@ -2329,6 +2329,8 @@ int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event * ev,
        return kernel_client_enqueue(client, ev, NULL, 0, atomic, hop);
 }
 
+EXPORT_SYMBOL(snd_seq_kernel_client_enqueue);
+
 /*
  * exported, called by kernel clients to enqueue events (with blocking)
  *
@@ -2341,6 +2343,7 @@ int snd_seq_kernel_client_enqueue_blocking(int client, struct snd_seq_event * ev
        return kernel_client_enqueue(client, ev, file, 1, atomic, hop);
 }
 
+EXPORT_SYMBOL(snd_seq_kernel_client_enqueue_blocking);
 
 /* 
  * exported, called by kernel clients to dispatch events directly to other
@@ -2377,6 +2380,7 @@ int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event * ev,
        return result;
 }
 
+EXPORT_SYMBOL(snd_seq_kernel_client_dispatch);
 
 /*
  * exported, called by kernel clients to perform same functions as with
@@ -2397,6 +2401,7 @@ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg)
        return result;
 }
 
+EXPORT_SYMBOL(snd_seq_kernel_client_ctl);
 
 /* exported (for OSS emulator) */
 int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table *wait)
@@ -2414,6 +2419,8 @@ int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table
        return 0;
 }
 
+EXPORT_SYMBOL(snd_seq_kernel_client_write_poll);
+
 /*---------------------------------------------------------------------------*/
 
 #ifdef CONFIG_PROC_FS
@@ -2462,11 +2469,10 @@ static void snd_seq_info_dump_subscribers(struct snd_info_buffer *buffer,
 static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer,
                                    struct snd_seq_client *client)
 {
-       struct list_head *l;
+       struct snd_seq_client_port *p;
 
-       down(&client->ports_mutex);
-       list_for_each(l, &client->ports_list_head) {
-               struct snd_seq_client_port *p = list_entry(l, struct snd_seq_client_port, list);
+       mutex_lock(&client->ports_mutex);
+       list_for_each_entry(p, &client->ports_list_head, list) {
                snd_iprintf(buffer, "  Port %3d : \"%s\" (%c%c%c%c)\n",
                            p->addr.port, p->name,
                            FLAG_PERM_RD(p->capability),
@@ -2476,7 +2482,7 @@ static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer,
                snd_seq_info_dump_subscribers(buffer, &p->c_src, 1, "    Connecting To: ");
                snd_seq_info_dump_subscribers(buffer, &p->c_dest, 0, "    Connected From: ");
        }
-       up(&client->ports_mutex);
+       mutex_unlock(&client->ports_mutex);
 }
 
 
@@ -2531,7 +2537,7 @@ void snd_seq_info_clients_read(struct snd_info_entry *entry,
  *  REGISTRATION PART
  */
 
-static struct file_operations snd_seq_f_ops =
+static const struct file_operations snd_seq_f_ops =
 {
        .owner =        THIS_MODULE,
        .read =         snd_seq_read,
@@ -2550,16 +2556,16 @@ int __init snd_sequencer_device_init(void)
 {
        int err;
 
-       if (down_interruptible(&register_mutex))
+       if (mutex_lock_interruptible(&register_mutex))
                return -ERESTARTSYS;
 
        if ((err = snd_register_device(SNDRV_DEVICE_TYPE_SEQUENCER, NULL, 0,
                                       &snd_seq_f_ops, NULL, "seq")) < 0) {
-               up(&register_mutex);
+               mutex_unlock(&register_mutex);
                return err;
        }
        
-       up(&register_mutex);
+       mutex_unlock(&register_mutex);
 
        return 0;
 }