mxser/mxser_new: first pass over termios reporting for the mxser cards
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Thu, 7 Feb 2008 08:16:41 +0000 (00:16 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 7 Feb 2008 16:42:34 +0000 (08:42 -0800)
Signed-off-by: Alan Cox <alan@redhat.com>
Cc: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/mxser.c
drivers/char/mxser_new.c

index 5d7901096048d23d2bdc11042e9e0c1f62b2da5d..35ff7a24554006bd0bf633e5abb2e3d57189feea 100644 (file)
@@ -1391,7 +1391,8 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
                        long baud;
                        if (get_user(baud, (long __user *)argp))
                                return -EFAULT;
-                       mxser_set_baud(info, baud);
+                       if (mxser_set_baud(info, baud) == -1)
+                               return -1;
                        return 0;
                }
        case MOXA_ASPP_GETBAUD:
@@ -2517,7 +2518,13 @@ static int mxser_change_speed(struct mxser_struct *info, struct ktermios *old_te
 #endif
        if (mxser_set_baud_method[info->port] == 0) {
                baud = tty_get_baud_rate(info->tty);
-               mxser_set_baud(info, baud);
+               if (mxser_set_baud(info, baud) == -1) {
+                       /* Use previous rate on a failure */
+                       if (old_termios) {
+                               baud = tty_termios_baud_rate(old_termios);
+                               tty_encode_baud_rate(info->tty, baud, baud);
+                       }
+               }
        }
 
        /* byte size and parity */
@@ -2691,27 +2698,31 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd)
 {
        int quot = 0;
        unsigned char cval;
-       int ret = 0;
        unsigned long flags;
+       unsigned int baud;
 
        if (!info->tty || !info->tty->termios)
-               return ret;
+               return -1;
 
        if (!(info->base))
-               return ret;
+               return -1;
 
        if (newspd > info->MaxCanSetBaudRate)
-               return 0;
+               return -1;
 
        info->realbaud = newspd;
        if (newspd == 134) {
                quot = (2 * info->baud_base / 269);
+               tty_encode_baud_rate(info->tty, 134, 134);
        } else if (newspd) {
                quot = info->baud_base / newspd;
                if (quot == 0)
                        quot = 1;
+               baud = info->baud_base / quot;
+               tty_encode_baud_rate(info->tty, baud, baud);
        } else {
                quot = 0;
+               tty_encode_baud_rate(info->tty, 0, 0);
        }
 
        info->timeout = ((info->xmit_fifo_size * HZ * 10 * quot) / info->baud_base);
@@ -2727,7 +2738,7 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd)
                info->MCR &= ~UART_MCR_DTR;
                outb(info->MCR, info->base + UART_MCR);
                spin_unlock_irqrestore(&info->slock, flags);
-               return ret;
+               return 0;
        }
 
        cval = inb(info->base + UART_LCR);
@@ -2739,7 +2750,7 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd)
        outb(cval, info->base + UART_LCR);      /* reset DLAB */
 
 
-       return ret;
+       return 0;
 }
 
 /*
index a4358acb1b2b9ff2109cc4561265cb6559736463..f74734b3407b3d331539e85ed3685d112ea23486 100644 (file)
@@ -452,18 +452,17 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp,
 static int mxser_set_baud(struct mxser_port *info, long newspd)
 {
        unsigned int i;
-       int quot = 0;
+       int quot = 0, baud;
        unsigned char cval;
-       int ret = 0;
 
        if (!info->tty || !info->tty->termios)
-               return ret;
+               return -1;
 
        if (!(info->ioaddr))
-               return ret;
+               return -1;
 
        if (newspd > info->max_baud)
-               return 0;
+               return -1;
 
        info->realbaud = newspd;
        for (i = 0; i < BAUD_TABLE_NO; i++)
@@ -476,10 +475,13 @@ static int mxser_set_baud(struct mxser_port *info, long newspd)
        } else {
                if (newspd == 134) {
                        quot = (2 * info->baud_base / 269);
+                       tty_encode_baud_rate(info->tty, 134, 134);
                } else if (newspd) {
                        quot = info->baud_base / newspd;
                        if (quot == 0)
                                quot = 1;
+                       baud = info->baud_base/quot;
+                       tty_encode_baud_rate(info->tty, baud, baud);
                } else {
                        quot = 0;
                }
@@ -494,7 +496,7 @@ static int mxser_set_baud(struct mxser_port *info, long newspd)
        } else {
                info->MCR &= ~UART_MCR_DTR;
                outb(info->MCR, info->ioaddr + UART_MCR);
-               return ret;
+               return 0;
        }
 
        cval = inb(info->ioaddr + UART_LCR);
@@ -518,7 +520,7 @@ static int mxser_set_baud(struct mxser_port *info, long newspd)
        } else
                SET_MOXA_MUST_ENUM_VALUE(info->ioaddr, 0);
 
-       return ret;
+       return 0;
 }
 
 /*