]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/class/cdc-acm.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia
[~andy/linux] / drivers / usb / class / cdc-acm.c
index 9543b19d410cabeef4a96dc57cf235b3b1cab49d..b32ccb46101960b62e2e81bf4f0b655797a45668 100644 (file)
@@ -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,