diff options
| author | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-03-21 11:26:18 +0400 | 
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-03-21 11:26:18 +0400 | 
| commit | 3d04d42312eacc68fbcddea337f7eb34bc035dfb (patch) | |
| tree | 7211df5704b743a7667159748c670a9744164482 /drivers/usb/class/cdc-acm.c | |
| parent | c98291ee1ceac03912e24b3219fa6e7dc0d52f5e (diff) | |
| parent | 69a7aebcf019ab3ff5764525ad6858fbe23bb86d (diff) | |
| download | linux-3d04d42312eacc68fbcddea337f7eb34bc035dfb.tar.xz | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 38 | 
1 files changed, 30 insertions, 8 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 9543b19d410c..b32ccb461019 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -39,6 +39,7 @@  #include <linux/serial.h>  #include <linux/tty_driver.h>  #include <linux/tty_flip.h> +#include <linux/serial.h>  #include <linux/module.h>  #include <linux/mutex.h>  #include <linux/uaccess.h> @@ -508,17 +509,12 @@ static int acm_tty_install(struct tty_driver *driver, struct tty_struct *tty)  	if (!acm)  		return -ENODEV; -	retval = tty_init_termios(tty); +	retval = tty_standard_install(driver, tty);  	if (retval)  		goto error_init_termios;  	tty->driver_data = acm; -	/* Final install (we use the default method) */ -	tty_driver_kref_get(driver); -	tty->count++; -	driver->ttys[tty->index] = tty; -  	return 0;  error_init_termios: @@ -773,10 +769,37 @@ static int acm_tty_tiocmset(struct tty_struct *tty,  	return acm_set_control(acm, acm->ctrlout = newctrl);  } +static int get_serial_info(struct acm *acm, struct serial_struct __user *info) +{ +	struct serial_struct tmp; + +	if (!info) +		return -EINVAL; + +	memset(&tmp, 0, sizeof(tmp)); +	tmp.flags = ASYNC_LOW_LATENCY; +	tmp.xmit_fifo_size = acm->writesize; +	tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); + +	if (copy_to_user(info, &tmp, sizeof(tmp))) +		return -EFAULT; +	else +		return 0; +} +  static int acm_tty_ioctl(struct tty_struct *tty,  					unsigned int cmd, unsigned long arg)  { -	return -ENOIOCTLCMD; +	struct acm *acm = tty->driver_data; +	int rv = -ENOIOCTLCMD; + +	switch (cmd) { +	case TIOCGSERIAL: /* gets serial port data */ +		rv = get_serial_info(acm, (struct serial_struct __user *) arg); +		break; +	} + +	return rv;  }  static const __u32 acm_tty_speed[] = { @@ -1675,7 +1698,6 @@ static int __init acm_init(void)  	acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);  	if (!acm_tty_driver)  		return -ENOMEM; -	acm_tty_driver->owner = THIS_MODULE,  	acm_tty_driver->driver_name = "acm",  	acm_tty_driver->name = "ttyACM",  	acm_tty_driver->major = ACM_TTY_MAJOR,  | 
