aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/Kconfig2
-rw-r--r--drivers/char/specialix.c38
2 files changed, 12 insertions, 28 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
index 224bc0a22908..e0bbbfb6a36b 100644
--- a/drivers/char/Kconfig
+++ b/drivers/char/Kconfig
@@ -288,7 +288,7 @@ config RISCOM8
288 288
289config SPECIALIX 289config SPECIALIX
290 tristate "Specialix IO8+ card support" 290 tristate "Specialix IO8+ card support"
291 depends on SERIAL_NONSTANDARD && BROKEN 291 depends on SERIAL_NONSTANDARD
292 help 292 help
293 This is a driver for the Specialix IO8+ multiport card (both the 293 This is a driver for the Specialix IO8+ multiport card (both the
294 ISA and the PCI version) which gives you many serial ports. You 294 ISA and the PCI version) which gives you many serial ports. You
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c
index f3184a8a75d6..242fd46fda22 100644
--- a/drivers/char/specialix.c
+++ b/drivers/char/specialix.c
@@ -1818,13 +1818,15 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file,
1818} 1818}
1819 1819
1820 1820
1821static void sx_send_break(struct specialix_port *port, 1821static int sx_send_break(struct tty_struct *tty, int length)
1822 unsigned long length)
1823{ 1822{
1823 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1824 struct specialix_board *bp = port_Board(port); 1824 struct specialix_board *bp = port_Board(port);
1825 unsigned long flags; 1825 unsigned long flags;
1826 1826
1827 func_enter(); 1827 func_enter();
1828 if (length == 0 || length == -1)
1829 return -EOPNOTSUPP;
1828 1830
1829 spin_lock_irqsave(&port->lock, flags); 1831 spin_lock_irqsave(&port->lock, flags);
1830 port->break_length = SPECIALIX_TPS / HZ * length; 1832 port->break_length = SPECIALIX_TPS / HZ * length;
@@ -1843,6 +1845,7 @@ static void sx_send_break(struct specialix_port *port,
1843 sx_wait_CCR(bp); 1845 sx_wait_CCR(bp);
1844 1846
1845 func_exit(); 1847 func_exit();
1848 return 0;
1846} 1849}
1847 1850
1848 1851
@@ -1929,7 +1932,6 @@ static int sx_ioctl(struct tty_struct *tty, struct file *filp,
1929 unsigned int cmd, unsigned long arg) 1932 unsigned int cmd, unsigned long arg)
1930{ 1933{
1931 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1934 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1932 int retval;
1933 void __user *argp = (void __user *)arg; 1935 void __user *argp = (void __user *)arg;
1934 1936
1935 func_enter(); 1937 func_enter();
@@ -1940,34 +1942,14 @@ static int sx_ioctl(struct tty_struct *tty, struct file *filp,
1940 } 1942 }
1941 1943
1942 switch (cmd) { 1944 switch (cmd) {
1943 case TCSBRK: /* SVID version: non-zero arg --> no break */
1944 retval = tty_check_change(tty);
1945 if (retval) {
1946 func_exit();
1947 return retval;
1948 }
1949 tty_wait_until_sent(tty, 0);
1950 if (!arg)
1951 sx_send_break(port, HZ/4); /* 1/4 second */
1952 return 0;
1953 case TCSBRKP: /* support for POSIX tcsendbreak() */
1954 retval = tty_check_change(tty);
1955 if (retval) {
1956 func_exit();
1957 return retval;
1958 }
1959 tty_wait_until_sent(tty, 0);
1960 sx_send_break(port, arg ? arg*(HZ/10) : HZ/4);
1961 func_exit();
1962 return 0;
1963 case TIOCGSERIAL: 1945 case TIOCGSERIAL:
1964 func_exit(); 1946 func_exit();
1965 return sx_get_serial_info(port, argp); 1947 return sx_get_serial_info(port, argp);
1966 case TIOCSSERIAL: 1948 case TIOCSSERIAL:
1967 func_exit(); 1949 func_exit();
1968 return sx_set_serial_info(port, argp); 1950 return sx_set_serial_info(port, argp);
1969 default: 1951 default:
1970 func_exit(); 1952 func_exit();
1971 return -ENOIOCTLCMD; 1953 return -ENOIOCTLCMD;
1972 } 1954 }
1973 func_exit(); 1955 func_exit();
@@ -2190,6 +2172,7 @@ static const struct tty_operations sx_ops = {
2190 .hangup = sx_hangup, 2172 .hangup = sx_hangup,
2191 .tiocmget = sx_tiocmget, 2173 .tiocmget = sx_tiocmget,
2192 .tiocmset = sx_tiocmset, 2174 .tiocmset = sx_tiocmset,
2175 .break_ctl = sx_send_break,
2193}; 2176};
2194 2177
2195static int sx_init_drivers(void) 2178static int sx_init_drivers(void)
@@ -2216,7 +2199,8 @@ static int sx_init_drivers(void)
2216 B9600 | CS8 | CREAD | HUPCL | CLOCAL; 2199 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2217 specialix_driver->init_termios.c_ispeed = 9600; 2200 specialix_driver->init_termios.c_ispeed = 9600;
2218 specialix_driver->init_termios.c_ospeed = 9600; 2201 specialix_driver->init_termios.c_ospeed = 9600;
2219 specialix_driver->flags = TTY_DRIVER_REAL_RAW; 2202 specialix_driver->flags = TTY_DRIVER_REAL_RAW |
2203 TTY_DRIVER_HARDWARE_BREAK;
2220 tty_set_operations(specialix_driver, &sx_ops); 2204 tty_set_operations(specialix_driver, &sx_ops);
2221 2205
2222 error = tty_register_driver(specialix_driver); 2206 error = tty_register_driver(specialix_driver);