diff options
Diffstat (limited to 'drivers/net/wan/cosa.c')
| -rw-r--r-- | drivers/net/wan/cosa.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 1d706eae3052..45ddfc9763cc 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c | |||
| @@ -90,6 +90,7 @@ | |||
| 90 | #include <linux/ioport.h> | 90 | #include <linux/ioport.h> |
| 91 | #include <linux/netdevice.h> | 91 | #include <linux/netdevice.h> |
| 92 | #include <linux/spinlock.h> | 92 | #include <linux/spinlock.h> |
| 93 | #include <linux/mutex.h> | ||
| 93 | #include <linux/device.h> | 94 | #include <linux/device.h> |
| 94 | 95 | ||
| 95 | #undef COSA_SLOW_IO /* for testing purposes only */ | 96 | #undef COSA_SLOW_IO /* for testing purposes only */ |
| @@ -127,7 +128,8 @@ struct channel_data { | |||
| 127 | int (*tx_done)(struct channel_data *channel, int size); | 128 | int (*tx_done)(struct channel_data *channel, int size); |
| 128 | 129 | ||
| 129 | /* Character device parts */ | 130 | /* Character device parts */ |
| 130 | struct semaphore rsem, wsem; | 131 | struct mutex rlock; |
| 132 | struct semaphore wsem; | ||
| 131 | char *rxdata; | 133 | char *rxdata; |
| 132 | int rxsize; | 134 | int rxsize; |
| 133 | wait_queue_head_t txwaitq, rxwaitq; | 135 | wait_queue_head_t txwaitq, rxwaitq; |
| @@ -807,7 +809,7 @@ static struct net_device_stats *cosa_net_stats(struct net_device *dev) | |||
| 807 | 809 | ||
| 808 | static void chardev_channel_init(struct channel_data *chan) | 810 | static void chardev_channel_init(struct channel_data *chan) |
| 809 | { | 811 | { |
| 810 | init_MUTEX(&chan->rsem); | 812 | mutex_init(&chan->rlock); |
| 811 | init_MUTEX(&chan->wsem); | 813 | init_MUTEX(&chan->wsem); |
| 812 | } | 814 | } |
| 813 | 815 | ||
| @@ -825,12 +827,12 @@ static ssize_t cosa_read(struct file *file, | |||
| 825 | cosa->name, cosa->firmware_status); | 827 | cosa->name, cosa->firmware_status); |
| 826 | return -EPERM; | 828 | return -EPERM; |
| 827 | } | 829 | } |
| 828 | if (down_interruptible(&chan->rsem)) | 830 | if (mutex_lock_interruptible(&chan->rlock)) |
| 829 | return -ERESTARTSYS; | 831 | return -ERESTARTSYS; |
| 830 | 832 | ||
| 831 | if ((chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL)) == NULL) { | 833 | if ((chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL)) == NULL) { |
| 832 | printk(KERN_INFO "%s: cosa_read() - OOM\n", cosa->name); | 834 | printk(KERN_INFO "%s: cosa_read() - OOM\n", cosa->name); |
| 833 | up(&chan->rsem); | 835 | mutex_unlock(&chan->rlock); |
| 834 | return -ENOMEM; | 836 | return -ENOMEM; |
| 835 | } | 837 | } |
| 836 | 838 | ||
| @@ -848,7 +850,7 @@ static ssize_t cosa_read(struct file *file, | |||
| 848 | remove_wait_queue(&chan->rxwaitq, &wait); | 850 | remove_wait_queue(&chan->rxwaitq, &wait); |
| 849 | current->state = TASK_RUNNING; | 851 | current->state = TASK_RUNNING; |
| 850 | spin_unlock_irqrestore(&cosa->lock, flags); | 852 | spin_unlock_irqrestore(&cosa->lock, flags); |
| 851 | up(&chan->rsem); | 853 | mutex_unlock(&chan->rlock); |
| 852 | return -ERESTARTSYS; | 854 | return -ERESTARTSYS; |
| 853 | } | 855 | } |
| 854 | } | 856 | } |
| @@ -857,7 +859,7 @@ static ssize_t cosa_read(struct file *file, | |||
| 857 | kbuf = chan->rxdata; | 859 | kbuf = chan->rxdata; |
| 858 | count = chan->rxsize; | 860 | count = chan->rxsize; |
| 859 | spin_unlock_irqrestore(&cosa->lock, flags); | 861 | spin_unlock_irqrestore(&cosa->lock, flags); |
| 860 | up(&chan->rsem); | 862 | mutex_unlock(&chan->rlock); |
| 861 | 863 | ||
| 862 | if (copy_to_user(buf, kbuf, count)) { | 864 | if (copy_to_user(buf, kbuf, count)) { |
| 863 | kfree(kbuf); | 865 | kfree(kbuf); |
