diff options
-rw-r--r-- | drivers/char/tty_ioctl.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c index 851cfcd2702a..d769e43f73fb 100644 --- a/drivers/char/tty_ioctl.c +++ b/drivers/char/tty_ioctl.c | |||
@@ -756,6 +756,32 @@ static int send_prio_char(struct tty_struct *tty, char ch) | |||
756 | } | 756 | } |
757 | 757 | ||
758 | /** | 758 | /** |
759 | * tty_change_softcar - carrier change ioctl helper | ||
760 | * @tty: tty to update | ||
761 | * @arg: enable/disable CLOCAL | ||
762 | * | ||
763 | * Perform a change to the CLOCAL state and call into the driver | ||
764 | * layer to make it visible. All done with the termios mutex | ||
765 | */ | ||
766 | |||
767 | static int tty_change_softcar(struct tty_struct *tty, int arg) | ||
768 | { | ||
769 | int ret = 0; | ||
770 | int bit = arg ? CLOCAL : 0; | ||
771 | struct ktermios old = *tty->termios; | ||
772 | |||
773 | mutex_lock(&tty->termios_mutex); | ||
774 | tty->termios->c_cflag &= ~CLOCAL; | ||
775 | tty->termios->c_cflag |= bit; | ||
776 | if (tty->driver->set_termios) | ||
777 | tty->driver->set_termios(tty, &old); | ||
778 | if ((tty->termios->c_cflag & CLOCAL) != bit) | ||
779 | ret = -EINVAL; | ||
780 | mutex_unlock(&tty->termios_mutex); | ||
781 | return ret; | ||
782 | } | ||
783 | |||
784 | /** | ||
759 | * tty_mode_ioctl - mode related ioctls | 785 | * tty_mode_ioctl - mode related ioctls |
760 | * @tty: tty for the ioctl | 786 | * @tty: tty for the ioctl |
761 | * @file: file pointer for the tty | 787 | * @file: file pointer for the tty |
@@ -865,12 +891,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file, | |||
865 | case TIOCSSOFTCAR: | 891 | case TIOCSSOFTCAR: |
866 | if (get_user(arg, (unsigned int __user *) arg)) | 892 | if (get_user(arg, (unsigned int __user *) arg)) |
867 | return -EFAULT; | 893 | return -EFAULT; |
868 | mutex_lock(&tty->termios_mutex); | 894 | return tty_change_softcar(tty, arg); |
869 | tty->termios->c_cflag = | ||
870 | ((tty->termios->c_cflag & ~CLOCAL) | | ||
871 | (arg ? CLOCAL : 0)); | ||
872 | mutex_unlock(&tty->termios_mutex); | ||
873 | return 0; | ||
874 | default: | 895 | default: |
875 | return -ENOIOCTLCMD; | 896 | return -ENOIOCTLCMD; |
876 | } | 897 | } |