aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/synclink_gt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/synclink_gt.c')
-rw-r--r--drivers/char/synclink_gt.c78
1 files changed, 34 insertions, 44 deletions
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c
index 334cf5c8c8b6..3c7ac6a3ff80 100644
--- a/drivers/char/synclink_gt.c
+++ b/drivers/char/synclink_gt.c
@@ -40,8 +40,8 @@
40#define DBGBH(fmt) if (debug_level >= DEBUG_LEVEL_BH) printk fmt 40#define DBGBH(fmt) if (debug_level >= DEBUG_LEVEL_BH) printk fmt
41#define DBGISR(fmt) if (debug_level >= DEBUG_LEVEL_ISR) printk fmt 41#define DBGISR(fmt) if (debug_level >= DEBUG_LEVEL_ISR) printk fmt
42#define DBGDATA(info, buf, size, label) if (debug_level >= DEBUG_LEVEL_DATA) trace_block((info), (buf), (size), (label)) 42#define DBGDATA(info, buf, size, label) if (debug_level >= DEBUG_LEVEL_DATA) trace_block((info), (buf), (size), (label))
43//#define DBGTBUF(info) dump_tbufs(info) 43/*#define DBGTBUF(info) dump_tbufs(info)*/
44//#define DBGRBUF(info) dump_rbufs(info) 44/*#define DBGRBUF(info) dump_rbufs(info)*/
45 45
46 46
47#include <linux/module.h> 47#include <linux/module.h>
@@ -62,7 +62,6 @@
62#include <linux/mm.h> 62#include <linux/mm.h>
63#include <linux/seq_file.h> 63#include <linux/seq_file.h>
64#include <linux/slab.h> 64#include <linux/slab.h>
65#include <linux/smp_lock.h>
66#include <linux/netdevice.h> 65#include <linux/netdevice.h>
67#include <linux/vmalloc.h> 66#include <linux/vmalloc.h>
68#include <linux/init.h> 67#include <linux/init.h>
@@ -901,8 +900,6 @@ static void wait_until_sent(struct tty_struct *tty, int timeout)
901 * Note: use tight timings here to satisfy the NIST-PCTS. 900 * Note: use tight timings here to satisfy the NIST-PCTS.
902 */ 901 */
903 902
904 lock_kernel();
905
906 if (info->params.data_rate) { 903 if (info->params.data_rate) {
907 char_time = info->timeout/(32 * 5); 904 char_time = info->timeout/(32 * 5);
908 if (!char_time) 905 if (!char_time)
@@ -920,8 +917,6 @@ static void wait_until_sent(struct tty_struct *tty, int timeout)
920 if (timeout && time_after(jiffies, orig_jiffies + timeout)) 917 if (timeout && time_after(jiffies, orig_jiffies + timeout))
921 break; 918 break;
922 } 919 }
923 unlock_kernel();
924
925exit: 920exit:
926 DBGINFO(("%s wait_until_sent exit\n", info->device_name)); 921 DBGINFO(("%s wait_until_sent exit\n", info->device_name));
927} 922}
@@ -1041,8 +1036,37 @@ static int ioctl(struct tty_struct *tty, struct file *file,
1041 return -EIO; 1036 return -EIO;
1042 } 1037 }
1043 1038
1044 lock_kernel(); 1039 switch (cmd) {
1045 1040 case MGSL_IOCWAITEVENT:
1041 return wait_mgsl_event(info, argp);
1042 case TIOCMIWAIT:
1043 return modem_input_wait(info,(int)arg);
1044 case TIOCGICOUNT:
1045 spin_lock_irqsave(&info->lock,flags);
1046 cnow = info->icount;
1047 spin_unlock_irqrestore(&info->lock,flags);
1048 p_cuser = argp;
1049 if (put_user(cnow.cts, &p_cuser->cts) ||
1050 put_user(cnow.dsr, &p_cuser->dsr) ||
1051 put_user(cnow.rng, &p_cuser->rng) ||
1052 put_user(cnow.dcd, &p_cuser->dcd) ||
1053 put_user(cnow.rx, &p_cuser->rx) ||
1054 put_user(cnow.tx, &p_cuser->tx) ||
1055 put_user(cnow.frame, &p_cuser->frame) ||
1056 put_user(cnow.overrun, &p_cuser->overrun) ||
1057 put_user(cnow.parity, &p_cuser->parity) ||
1058 put_user(cnow.brk, &p_cuser->brk) ||
1059 put_user(cnow.buf_overrun, &p_cuser->buf_overrun))
1060 return -EFAULT;
1061 return 0;
1062 case MGSL_IOCSGPIO:
1063 return set_gpio(info, argp);
1064 case MGSL_IOCGGPIO:
1065 return get_gpio(info, argp);
1066 case MGSL_IOCWAITGPIO:
1067 return wait_gpio(info, argp);
1068 }
1069 mutex_lock(&info->port.mutex);
1046 switch (cmd) { 1070 switch (cmd) {
1047 case MGSL_IOCGPARAMS: 1071 case MGSL_IOCGPARAMS:
1048 ret = get_params(info, argp); 1072 ret = get_params(info, argp);
@@ -1068,50 +1092,16 @@ static int ioctl(struct tty_struct *tty, struct file *file,
1068 case MGSL_IOCGSTATS: 1092 case MGSL_IOCGSTATS:
1069 ret = get_stats(info, argp); 1093 ret = get_stats(info, argp);
1070 break; 1094 break;
1071 case MGSL_IOCWAITEVENT:
1072 ret = wait_mgsl_event(info, argp);
1073 break;
1074 case TIOCMIWAIT:
1075 ret = modem_input_wait(info,(int)arg);
1076 break;
1077 case MGSL_IOCGIF: 1095 case MGSL_IOCGIF:
1078 ret = get_interface(info, argp); 1096 ret = get_interface(info, argp);
1079 break; 1097 break;
1080 case MGSL_IOCSIF: 1098 case MGSL_IOCSIF:
1081 ret = set_interface(info,(int)arg); 1099 ret = set_interface(info,(int)arg);
1082 break; 1100 break;
1083 case MGSL_IOCSGPIO:
1084 ret = set_gpio(info, argp);
1085 break;
1086 case MGSL_IOCGGPIO:
1087 ret = get_gpio(info, argp);
1088 break;
1089 case MGSL_IOCWAITGPIO:
1090 ret = wait_gpio(info, argp);
1091 break;
1092 case TIOCGICOUNT:
1093 spin_lock_irqsave(&info->lock,flags);
1094 cnow = info->icount;
1095 spin_unlock_irqrestore(&info->lock,flags);
1096 p_cuser = argp;
1097 if (put_user(cnow.cts, &p_cuser->cts) ||
1098 put_user(cnow.dsr, &p_cuser->dsr) ||
1099 put_user(cnow.rng, &p_cuser->rng) ||
1100 put_user(cnow.dcd, &p_cuser->dcd) ||
1101 put_user(cnow.rx, &p_cuser->rx) ||
1102 put_user(cnow.tx, &p_cuser->tx) ||
1103 put_user(cnow.frame, &p_cuser->frame) ||
1104 put_user(cnow.overrun, &p_cuser->overrun) ||
1105 put_user(cnow.parity, &p_cuser->parity) ||
1106 put_user(cnow.brk, &p_cuser->brk) ||
1107 put_user(cnow.buf_overrun, &p_cuser->buf_overrun))
1108 ret = -EFAULT;
1109 ret = 0;
1110 break;
1111 default: 1101 default:
1112 ret = -ENOIOCTLCMD; 1102 ret = -ENOIOCTLCMD;
1113 } 1103 }
1114 unlock_kernel(); 1104 mutex_unlock(&info->port.mutex);
1115 return ret; 1105 return ret;
1116} 1106}
1117 1107