diff options
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/mxser.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 4a584db09494..e082ae055c39 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c @@ -1411,10 +1411,9 @@ static int mxser_cflags_changed(struct mxser_port *info, unsigned long arg, static int mxser_ioctl_op_mode(struct mxser_port *port, int index, bool set, int __user *u_opmode) { - static const unsigned char ModeMask[] = { 0xfc, 0xf3, 0xcf, 0x3f }; int opmode, p = index % 4; int shiftbit = p * 2; - unsigned char val, mask; + u8 val; if (port->board->must_hwid != MOXA_MUST_MU860_HWID) return -EFAULT; @@ -1423,30 +1422,24 @@ static int mxser_ioctl_op_mode(struct mxser_port *port, int index, bool set, if (get_user(opmode, u_opmode)) return -EFAULT; - if (opmode != RS232_MODE && opmode != RS485_2WIRE_MODE && - opmode != RS422_MODE && - opmode != RS485_4WIRE_MODE) - return -EFAULT; - - mask = ModeMask[p]; + if (opmode & ~OP_MODE_MASK) + return -EINVAL; spin_lock_irq(&port->slock); val = inb(port->opmode_ioaddr); - val &= mask; + val &= ~(OP_MODE_MASK << shiftbit); val |= (opmode << shiftbit); outb(val, port->opmode_ioaddr); spin_unlock_irq(&port->slock); - } else { - spin_lock_irq(&port->slock); - opmode = inb(port->opmode_ioaddr) >> shiftbit; - spin_unlock_irq(&port->slock); - opmode &= OP_MODE_MASK; - if (put_user(opmode, u_opmode)) - return -EFAULT; + return 0; } - return 0; + spin_lock_irq(&port->slock); + opmode = inb(port->opmode_ioaddr) >> shiftbit; + spin_unlock_irq(&port->slock); + + return put_user(opmode & OP_MODE_MASK, u_opmode); } static int mxser_ioctl(struct tty_struct *tty, |