]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
TTY: amiserial, simplify set_serial_info
authorJiri Slaby <jslaby@suse.cz>
Mon, 5 Mar 2012 13:52:21 +0000 (14:52 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 8 Mar 2012 20:30:50 +0000 (12:30 -0800)
Do not copy whole serial_state. We only need to know whether the speed
is to be changed. Hence store the info in advance and use it later.
A simple bool is enough.

Also remove reduntant assignments and move the tests directly to the
'if'.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/amiserial.c

index 410e8e7e6bfe33a6502dc6880b792076c0d2c1a1..165cd79faea200652c829e7263fcaf91c81ac4de 100644 (file)
@@ -1042,21 +1042,19 @@ static int set_serial_info(struct serial_state *state,
                           struct serial_struct __user * new_info)
 {
        struct serial_struct new_serial;
-       struct serial_state old_state;
-       unsigned int            change_irq,change_port;
+       bool change_spd;
        int                     retval = 0;
 
        if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
                return -EFAULT;
 
        tty_lock();
-       old_state = *state;
-  
-       change_irq = new_serial.irq != state->irq;
-       change_port = (new_serial.port != state->port);
-       if(change_irq || change_port || (new_serial.xmit_fifo_size != state->xmit_fifo_size)) {
-         tty_unlock();
-         return -EINVAL;
+       change_spd = ((new_serial.flags ^ state->flags) & ASYNC_SPD_MASK) ||
+               new_serial.custom_divisor != state->custom_divisor;
+       if (new_serial.irq != state->irq || new_serial.port != state->port ||
+                       new_serial.xmit_fifo_size != state->xmit_fifo_size) {
+               tty_unlock();
+               return -EINVAL;
        }
   
        if (!serial_isroot()) {
@@ -1092,9 +1090,7 @@ static int set_serial_info(struct serial_state *state,
 
 check_and_exit:
        if (state->flags & ASYNC_INITIALIZED) {
-               if (((old_state.flags & ASYNC_SPD_MASK) !=
-                    (state->flags & ASYNC_SPD_MASK)) ||
-                   (old_state.custom_divisor != state->custom_divisor)) {
+               if (change_spd) {
                        if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
                                state->tty->alt_speed = 57600;
                        if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)