isicom: restore using hardware break support
authorAlan Cox <alan@redhat.com>
Tue, 22 Jul 2008 10:18:21 +0000 (11:18 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Jul 2008 20:03:28 +0000 (13:03 -0700)
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/Kconfig
drivers/char/isicom.c

index 9ead63cd56489fb3b80a400bf7b3d077c788a02e..d3f8f0e7a5a6268f5c9ed6e60f2256fe38ab44ea 100644 (file)
@@ -218,7 +218,7 @@ config MOXA_SMARTIO
 
 config ISI
        tristate "Multi-Tech multiport card support (EXPERIMENTAL)"
-       depends on SERIAL_NONSTANDARD && PCI && BROKEN
+       depends on SERIAL_NONSTANDARD && PCI
        select FW_LOADER
        help
          This is a driver for the Multi-Tech cards which provide several
index d4281df10c22dbd54a28f790774c7636126cd709..8f7cc190b62d420116b5c0d30e70899c3332c94d 100644 (file)
@@ -1181,14 +1181,17 @@ static int isicom_chars_in_buffer(struct tty_struct *tty)
 }
 
 /* ioctl et all */
-static inline void isicom_send_break(struct isi_port *port,
-       unsigned long length)
+static int isicom_send_break(struct tty_struct *tty, int length)
 {
+       struct isi_port *port = tty->driver_data;
        struct isi_board *card = port->card;
        unsigned long base = card->base;
 
+       if (length == -1)
+               return -EOPNOTSUPP;
+
        if (!lock_card(card))
-               return;
+               return -EINVAL;
 
        outw(0x8000 | ((port->channel) << (card->shift_count)) | 0x3, base);
        outw((length & 0xff) << 8 | 0x00, base);
@@ -1196,6 +1199,7 @@ static inline void isicom_send_break(struct isi_port *port,
        InterruptTheCard(base);
 
        unlock_card(card);
+       return 0;
 }
 
 static int isicom_tiocmget(struct tty_struct *tty, struct file *file)
@@ -1305,28 +1309,11 @@ static int isicom_ioctl(struct tty_struct *tty, struct file *filp,
 {
        struct isi_port *port = tty->driver_data;
        void __user *argp = (void __user *)arg;
-       int retval;
 
        if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
                return -ENODEV;
 
        switch (cmd) {
-       case TCSBRK:
-               retval = tty_check_change(tty);
-               if (retval)
-                       return retval;
-               tty_wait_until_sent(tty, 0);
-               if (!arg)
-                       isicom_send_break(port, HZ/4);
-               return 0;
-
-       case TCSBRKP:
-               retval = tty_check_change(tty);
-               if (retval)
-                       return retval;
-               tty_wait_until_sent(tty, 0);
-               isicom_send_break(port, arg ? arg * (HZ/10) : HZ/4);
-               return 0;
        case TIOCGSERIAL:
                return isicom_get_serial_info(port, argp);
 
@@ -1459,6 +1446,7 @@ static const struct tty_operations isicom_ops = {
        .flush_buffer           = isicom_flush_buffer,
        .tiocmget               = isicom_tiocmget,
        .tiocmset               = isicom_tiocmset,
+       .break_ctl              = isicom_send_break,
 };
 
 static int __devinit reset_card(struct pci_dev *pdev,
@@ -1832,7 +1820,7 @@ static int __init isicom_init(void)
        isicom_normal->init_termios.c_cflag     = B9600 | CS8 | CREAD | HUPCL |
                CLOCAL;
        isicom_normal->flags                    = TTY_DRIVER_REAL_RAW |
-               TTY_DRIVER_DYNAMIC_DEV;
+               TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_HARDWARE_BREAK;
        tty_set_operations(isicom_normal, &isicom_ops);
 
        retval = tty_register_driver(isicom_normal);