cdc-acm.c (6097a07411005c0184cf90256743c784079198fc) cdc-acm.c (ba2d8ce9db0a61505362bb17b8899df3d3326146)
1/*
2 * cdc-acm.c
3 *
4 * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de>
5 * Copyright (c) 1999 Pavel Machek <pavel@ucw.cz>
6 * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com>
7 * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz>
8 * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name>

--- 773 unchanged lines hidden (view full) ---

782
783 if (!info)
784 return -EINVAL;
785
786 memset(&tmp, 0, sizeof(tmp));
787 tmp.flags = ASYNC_LOW_LATENCY;
788 tmp.xmit_fifo_size = acm->writesize;
789 tmp.baud_base = le32_to_cpu(acm->line.dwDTERate);
1/*
2 * cdc-acm.c
3 *
4 * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de>
5 * Copyright (c) 1999 Pavel Machek <pavel@ucw.cz>
6 * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com>
7 * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz>
8 * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name>

--- 773 unchanged lines hidden (view full) ---

782
783 if (!info)
784 return -EINVAL;
785
786 memset(&tmp, 0, sizeof(tmp));
787 tmp.flags = ASYNC_LOW_LATENCY;
788 tmp.xmit_fifo_size = acm->writesize;
789 tmp.baud_base = le32_to_cpu(acm->line.dwDTERate);
790 tmp.close_delay = acm->port.close_delay / 10;
791 tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
792 ASYNC_CLOSING_WAIT_NONE :
793 acm->port.closing_wait / 10;
790
791 if (copy_to_user(info, &tmp, sizeof(tmp)))
792 return -EFAULT;
793 else
794 return 0;
795}
796
794
795 if (copy_to_user(info, &tmp, sizeof(tmp)))
796 return -EFAULT;
797 else
798 return 0;
799}
800
801static int set_serial_info(struct acm *acm,
802 struct serial_struct __user *newinfo)
803{
804 struct serial_struct new_serial;
805 unsigned int closing_wait, close_delay;
806 int retval = 0;
807
808 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
809 return -EFAULT;
810
811 close_delay = new_serial.close_delay * 10;
812 closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
813 ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
814
815 mutex_lock(&acm->port.mutex);
816
817 if (!capable(CAP_SYS_ADMIN)) {
818 if ((close_delay != acm->port.close_delay) ||
819 (closing_wait != acm->port.closing_wait))
820 retval = -EPERM;
821 else
822 retval = -EOPNOTSUPP;
823 } else {
824 acm->port.close_delay = close_delay;
825 acm->port.closing_wait = closing_wait;
826 }
827
828 mutex_unlock(&acm->port.mutex);
829 return retval;
830}
831
797static int acm_tty_ioctl(struct tty_struct *tty,
798 unsigned int cmd, unsigned long arg)
799{
800 struct acm *acm = tty->driver_data;
801 int rv = -ENOIOCTLCMD;
802
803 switch (cmd) {
804 case TIOCGSERIAL: /* gets serial port data */
805 rv = get_serial_info(acm, (struct serial_struct __user *) arg);
806 break;
832static int acm_tty_ioctl(struct tty_struct *tty,
833 unsigned int cmd, unsigned long arg)
834{
835 struct acm *acm = tty->driver_data;
836 int rv = -ENOIOCTLCMD;
837
838 switch (cmd) {
839 case TIOCGSERIAL: /* gets serial port data */
840 rv = get_serial_info(acm, (struct serial_struct __user *) arg);
841 break;
842 case TIOCSSERIAL:
843 rv = set_serial_info(acm, (struct serial_struct __user *) arg);
844 break;
807 }
808
809 return rv;
810}
811
812static const __u32 acm_tty_speed[] = {
813 0, 50, 75, 110, 134, 150, 200, 300, 600,
814 1200, 1800, 2400, 4800, 9600, 19200, 38400,

--- 953 unchanged lines hidden ---
845 }
846
847 return rv;
848}
849
850static const __u32 acm_tty_speed[] = {
851 0, 50, 75, 110, 134, 150, 200, 300, 600,
852 1200, 1800, 2400, 4800, 9600, 19200, 38400,

--- 953 unchanged lines hidden ---