aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/synclinkmp.c
diff options
context:
space:
mode:
authorAlan Cox <alan@linux.intel.com>2010-06-01 16:52:46 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-08-10 16:47:40 -0400
commitf602501d90e0da28c8e6f5e4569b8bf5d40a9d9c (patch)
treeae0bfcf04f6ef9f4a374b5105d59c1830776d209 /drivers/char/synclinkmp.c
parent417b6e0e146ba38eec5d79777433e38c73d4feb1 (diff)
synclink: kill the big kernel lock
We don't need it while waiting and we can lock the ioctls using the port mutex. While at it eliminate use of the hangup mutex and switch to the port mutex. Signed-off-by: Alan Cox <alan@linux.intel.com> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/char/synclinkmp.c')
-rw-r--r--drivers/char/synclinkmp.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c
index 2b18adc4ee19..8da976bd7314 100644
--- a/drivers/char/synclinkmp.c
+++ b/drivers/char/synclinkmp.c
@@ -52,7 +52,6 @@
52#include <linux/mm.h> 52#include <linux/mm.h>
53#include <linux/seq_file.h> 53#include <linux/seq_file.h>
54#include <linux/slab.h> 54#include <linux/slab.h>
55#include <linux/smp_lock.h>
56#include <linux/netdevice.h> 55#include <linux/netdevice.h>
57#include <linux/vmalloc.h> 56#include <linux/vmalloc.h>
58#include <linux/init.h> 57#include <linux/init.h>
@@ -1062,9 +1061,7 @@ static void wait_until_sent(struct tty_struct *tty, int timeout)
1062 if (sanity_check(info, tty->name, "wait_until_sent")) 1061 if (sanity_check(info, tty->name, "wait_until_sent"))
1063 return; 1062 return;
1064 1063
1065 lock_kernel(); 1064 if (!test_bit(ASYNCB_INITIALIZED, &info->port.flags))
1066
1067 if (!(info->port.flags & ASYNC_INITIALIZED))
1068 goto exit; 1065 goto exit;
1069 1066
1070 orig_jiffies = jiffies; 1067 orig_jiffies = jiffies;
@@ -1094,8 +1091,10 @@ static void wait_until_sent(struct tty_struct *tty, int timeout)
1094 break; 1091 break;
1095 } 1092 }
1096 } else { 1093 } else {
1097 //TODO: determine if there is something similar to USC16C32 1094 /*
1098 // TXSTATUS_ALL_SENT status 1095 * TODO: determine if there is something similar to USC16C32
1096 * TXSTATUS_ALL_SENT status
1097 */
1099 while ( info->tx_active && info->tx_enabled) { 1098 while ( info->tx_active && info->tx_enabled) {
1100 msleep_interruptible(jiffies_to_msecs(char_time)); 1099 msleep_interruptible(jiffies_to_msecs(char_time));
1101 if (signal_pending(current)) 1100 if (signal_pending(current))
@@ -1106,7 +1105,6 @@ static void wait_until_sent(struct tty_struct *tty, int timeout)
1106 } 1105 }
1107 1106
1108exit: 1107exit:
1109 unlock_kernel();
1110 if (debug_level >= DEBUG_LEVEL_INFO) 1108 if (debug_level >= DEBUG_LEVEL_INFO)
1111 printk("%s(%d):%s wait_until_sent() exit\n", 1109 printk("%s(%d):%s wait_until_sent() exit\n",
1112 __FILE__,__LINE__, info->device_name ); 1110 __FILE__,__LINE__, info->device_name );
@@ -1122,7 +1120,6 @@ static int write_room(struct tty_struct *tty)
1122 if (sanity_check(info, tty->name, "write_room")) 1120 if (sanity_check(info, tty->name, "write_room"))
1123 return 0; 1121 return 0;
1124 1122
1125 lock_kernel();
1126 if (info->params.mode == MGSL_MODE_HDLC) { 1123 if (info->params.mode == MGSL_MODE_HDLC) {
1127 ret = (info->tx_active) ? 0 : HDLC_MAX_FRAME_SIZE; 1124 ret = (info->tx_active) ? 0 : HDLC_MAX_FRAME_SIZE;
1128 } else { 1125 } else {
@@ -1130,7 +1127,6 @@ static int write_room(struct tty_struct *tty)
1130 if (ret < 0) 1127 if (ret < 0)
1131 ret = 0; 1128 ret = 0;
1132 } 1129 }
1133 unlock_kernel();
1134 1130
1135 if (debug_level >= DEBUG_LEVEL_INFO) 1131 if (debug_level >= DEBUG_LEVEL_INFO)
1136 printk("%s(%d):%s write_room()=%d\n", 1132 printk("%s(%d):%s write_room()=%d\n",
@@ -1251,7 +1247,7 @@ static void tx_release(struct tty_struct *tty)
1251 * 1247 *
1252 * Return Value: 0 if success, otherwise error code 1248 * Return Value: 0 if success, otherwise error code
1253 */ 1249 */
1254static int do_ioctl(struct tty_struct *tty, struct file *file, 1250static int ioctl(struct tty_struct *tty, struct file *file,
1255 unsigned int cmd, unsigned long arg) 1251 unsigned int cmd, unsigned long arg)
1256{ 1252{
1257 SLMP_INFO *info = tty->driver_data; 1253 SLMP_INFO *info = tty->driver_data;
@@ -1341,16 +1337,6 @@ static int do_ioctl(struct tty_struct *tty, struct file *file,
1341 return 0; 1337 return 0;
1342} 1338}
1343 1339
1344static int ioctl(struct tty_struct *tty, struct file *file,
1345 unsigned int cmd, unsigned long arg)
1346{
1347 int ret;
1348 lock_kernel();
1349 ret = do_ioctl(tty, file, cmd, arg);
1350 unlock_kernel();
1351 return ret;
1352}
1353
1354/* 1340/*
1355 * /proc fs routines.... 1341 * /proc fs routines....
1356 */ 1342 */
@@ -2883,7 +2869,9 @@ static int get_stats(SLMP_INFO * info, struct mgsl_icount __user *user_icount)
2883 if (!user_icount) { 2869 if (!user_icount) {
2884 memset(&info->icount, 0, sizeof(info->icount)); 2870 memset(&info->icount, 0, sizeof(info->icount));
2885 } else { 2871 } else {
2872 mutex_lock(&info->port.mutex);
2886 COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); 2873 COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount));
2874 mutex_unlock(&info->port.mutex);
2887 if (err) 2875 if (err)
2888 return -EFAULT; 2876 return -EFAULT;
2889 } 2877 }
@@ -2898,7 +2886,9 @@ static int get_params(SLMP_INFO * info, MGSL_PARAMS __user *user_params)
2898 printk("%s(%d):%s get_params()\n", 2886 printk("%s(%d):%s get_params()\n",
2899 __FILE__,__LINE__, info->device_name); 2887 __FILE__,__LINE__, info->device_name);
2900 2888
2889 mutex_lock(&info->port.mutex);
2901 COPY_TO_USER(err,user_params, &info->params, sizeof(MGSL_PARAMS)); 2890 COPY_TO_USER(err,user_params, &info->params, sizeof(MGSL_PARAMS));
2891 mutex_unlock(&info->port.mutex);
2902 if (err) { 2892 if (err) {
2903 if ( debug_level >= DEBUG_LEVEL_INFO ) 2893 if ( debug_level >= DEBUG_LEVEL_INFO )
2904 printk( "%s(%d):%s get_params() user buffer copy failed\n", 2894 printk( "%s(%d):%s get_params() user buffer copy failed\n",
@@ -2926,11 +2916,13 @@ static int set_params(SLMP_INFO * info, MGSL_PARAMS __user *new_params)
2926 return -EFAULT; 2916 return -EFAULT;
2927 } 2917 }
2928 2918
2919 mutex_lock(&info->port.mutex);
2929 spin_lock_irqsave(&info->lock,flags); 2920 spin_lock_irqsave(&info->lock,flags);
2930 memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS)); 2921 memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS));
2931 spin_unlock_irqrestore(&info->lock,flags); 2922 spin_unlock_irqrestore(&info->lock,flags);
2932 2923
2933 change_params(info); 2924 change_params(info);
2925 mutex_unlock(&info->port.mutex);
2934 2926
2935 return 0; 2927 return 0;
2936} 2928}