patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / usb / serial / usb-serial.c
index 609c1d1..19c92e8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * USB Serial Converter driver
  *
- * Copyright (C) 1999 - 2003 Greg Kroah-Hartman (greg@kroah.com)
+ * Copyright (C) 1999 - 2004 Greg Kroah-Hartman (greg@kroah.com)
  * Copyright (C) 2000 Peter Berger (pberger@brimson.com)
  * Copyright (C) 2000 Al Borchers (borchers@steinerpoint.com)
  *
 #include <linux/tty_driver.h>
 #include <linux/tty_flip.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/spinlock.h>
 #include <linux/list.h>
 #include <linux/smp_lock.h>
@@ -416,8 +417,7 @@ static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_po
                        }
                if (good_spot == 0)
                        continue;
-                       
-               serial->magic = USB_SERIAL_MAGIC;
+
                *minor = i;
                dbg("%s - minor base = %d", __FUNCTION__, *minor);
                for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i)
@@ -460,9 +460,10 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
 
        /* get the serial object associated with this tty pointer */
        serial = usb_serial_get_by_index(tty->index);
-
-       if (serial_paranoia_check (serial, __FUNCTION__))
-               return -ENODEV;
+       if (!serial) {
+               retval = -ENODEV;
+               goto bailout;
+       }
 
        /* set up our port structure making the tty driver remember our port object, and us it */
        portNumber = tty->index - serial->minor;
@@ -496,9 +497,8 @@ bailout:
 static void serial_close(struct tty_struct *tty, struct file * filp)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
 
-       if (!serial)
+       if (!port)
                return;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
@@ -524,12 +524,8 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
 static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
        int retval = -EINVAL;
 
-       if (!serial)
-               return -ENODEV;
-
        dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
 
        if (!port->open_count) {
@@ -538,7 +534,7 @@ static int serial_write (struct tty_struct * tty, int from_user, const unsigned
        }
 
        /* pass on to the driver specific version of this function */
-       retval = serial->type->write(port, from_user, buf, count);
+       retval = port->serial->type->write(port, from_user, buf, count);
 
 exit:
        return retval;
@@ -547,12 +543,8 @@ exit:
 static int serial_write_room (struct tty_struct *tty) 
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
        int retval = -EINVAL;
 
-       if (!serial)
-               return -ENODEV;
-
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -561,7 +553,7 @@ static int serial_write_room (struct tty_struct *tty)
        }
 
        /* pass on to the driver specific version of this function */
-       retval = serial->type->write_room(port);
+       retval = port->serial->type->write_room(port);
 
 exit:
        return retval;
@@ -570,12 +562,8 @@ exit:
 static int serial_chars_in_buffer (struct tty_struct *tty) 
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
        int retval = -EINVAL;
 
-       if (!serial)
-               return -ENODEV;
-
        dbg("%s = port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -584,7 +572,7 @@ static int serial_chars_in_buffer (struct tty_struct *tty)
        }
 
        /* pass on to the driver specific version of this function */
-       retval = serial->type->chars_in_buffer(port);
+       retval = port->serial->type->chars_in_buffer(port);
 
 exit:
        return retval;
@@ -593,10 +581,6 @@ exit:
 static void serial_throttle (struct tty_struct * tty)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
-
-       if (!serial)
-               return;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -606,8 +590,8 @@ static void serial_throttle (struct tty_struct * tty)
        }
 
        /* pass on to the driver specific version of this function */
-       if (serial->type->throttle)
-               serial->type->throttle(port);
+       if (port->serial->type->throttle)
+               port->serial->type->throttle(port);
 
 exit:
        ;
@@ -616,10 +600,6 @@ exit:
 static void serial_unthrottle (struct tty_struct * tty)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
-
-       if (!serial)
-               return;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -629,8 +609,8 @@ static void serial_unthrottle (struct tty_struct * tty)
        }
 
        /* pass on to the driver specific version of this function */
-       if (serial->type->unthrottle)
-               serial->type->unthrottle(port);
+       if (port->serial->type->unthrottle)
+               port->serial->type->unthrottle(port);
 
 exit:
        ;
@@ -639,12 +619,8 @@ exit:
 static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
        int retval = -ENODEV;
 
-       if (!serial)
-               return -ENODEV;
-
        dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
 
        if (!port->open_count) {
@@ -653,8 +629,8 @@ static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned in
        }
 
        /* pass on to the driver specific version of this function if it is available */
-       if (serial->type->ioctl)
-               retval = serial->type->ioctl(port, file, cmd, arg);
+       if (port->serial->type->ioctl)
+               retval = port->serial->type->ioctl(port, file, cmd, arg);
        else
                retval = -ENOIOCTLCMD;
 
@@ -665,10 +641,6 @@ exit:
 static void serial_set_termios (struct tty_struct *tty, struct termios * old)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
-
-       if (!serial)
-               return;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -678,8 +650,8 @@ static void serial_set_termios (struct tty_struct *tty, struct termios * old)
        }
 
        /* pass on to the driver specific version of this function if it is available */
-       if (serial->type->set_termios)
-               serial->type->set_termios(port, old);
+       if (port->serial->type->set_termios)
+               port->serial->type->set_termios(port, old);
 
 exit:
        ;
@@ -688,10 +660,6 @@ exit:
 static void serial_break (struct tty_struct *tty, int break_state)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
-
-       if (!serial)
-               return;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -701,8 +669,8 @@ static void serial_break (struct tty_struct *tty, int break_state)
        }
 
        /* pass on to the driver specific version of this function if it is available */
-       if (serial->type->break_ctl)
-               serial->type->break_ctl(port, break_state);
+       if (port->serial->type->break_ctl)
+               port->serial->type->break_ctl(port, break_state);
 
 exit:
        ;
@@ -761,10 +729,6 @@ done:
 static int serial_tiocmget (struct tty_struct *tty, struct file *file)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
-
-       if (!serial)
-               goto exit;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -773,8 +737,8 @@ static int serial_tiocmget (struct tty_struct *tty, struct file *file)
                goto exit;
        }
 
-       if (serial->type->tiocmget)
-               return serial->type->tiocmget(port, file);
+       if (port->serial->type->tiocmget)
+               return port->serial->type->tiocmget(port, file);
 
 exit:
        return -EINVAL;
@@ -784,10 +748,6 @@ static int serial_tiocmset (struct tty_struct *tty, struct file *file,
                            unsigned int set, unsigned int clear)
 {
        struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
-       struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
-
-       if (!serial)
-               goto exit;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -796,8 +756,8 @@ static int serial_tiocmset (struct tty_struct *tty, struct file *file,
                goto exit;
        }
 
-       if (serial->type->tiocmset)
-               return serial->type->tiocmset(port, file, set, clear);
+       if (port->serial->type->tiocmset)
+               return port->serial->type->tiocmset(port, file, set, clear);
 
 exit:
        return -EINVAL;
@@ -806,7 +766,6 @@ exit:
 void usb_serial_port_softint(void *private)
 {
        struct usb_serial_port *port = (struct usb_serial_port *)private;
-       struct usb_serial *serial;
        struct tty_struct *tty;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
@@ -814,10 +773,6 @@ void usb_serial_port_softint(void *private)
        if (!port)
                return;
 
-       serial = get_usb_serial (port, __FUNCTION__);
-       if (!serial)
-               return;
-
        tty = port->tty;
        if (!tty)
                return;
@@ -1037,7 +992,7 @@ int usb_serial_probe(struct usb_interface *interface,
             (dev->descriptor.idProduct == ATEN_PRODUCT_ID))) {
                if (interface != dev->actconfig->interface[0]) {
                        /* check out the endpoints of the other interface*/
-                       iface_desc = &dev->actconfig->interface[0]->altsetting[0];
+                       iface_desc = dev->actconfig->interface[0]->cur_altsetting;
                        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
                                endpoint = &iface_desc->endpoint[i].desc;
                                if ((endpoint->bEndpointAddress & 0x80) &&
@@ -1117,7 +1072,6 @@ int usb_serial_probe(struct usb_interface *interface,
                memset(port, 0x00, sizeof(struct usb_serial_port));
                port->number = i + serial->minor;
                port->serial = serial;
-               port->magic = USB_SERIAL_PORT_MAGIC;
                INIT_WORK(&port->work, usb_serial_port_softint, port);
                serial->port[i] = port;
        }
@@ -1463,5 +1417,5 @@ MODULE_AUTHOR( DRIVER_AUTHOR );
 MODULE_DESCRIPTION( DRIVER_DESC );
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(debug, "i");
+module_param(debug, bool, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(debug, "Debug enabled or not");