Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[pandora-kernel.git] / drivers / usb / serial / ipaq.c
index d9fb376..832a5a4 100644 (file)
@@ -53,7 +53,7 @@
 #include <linux/tty_flip.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
-#include <asm/uaccess.h>
+#include <linux/uaccess.h>
 #include <linux/usb.h>
 #include <linux/usb/serial.h>
 #include "ipaq.h"
@@ -74,19 +74,21 @@ static int connect_retries = KP_RETRIES;
 static int initial_wait;
 
 /* Function prototypes for an ipaq */
-static int  ipaq_open (struct usb_serial_port *port, struct file *filp);
-static void ipaq_close (struct usb_serial_port *port, struct file *filp);
-static int  ipaq_startup (struct usb_serial *serial);
-static void ipaq_shutdown (struct usb_serial *serial);
-static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
-                      int count);
-static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf,
-                          int count);
+static int  ipaq_open(struct tty_struct *tty,
+                       struct usb_serial_port *port, struct file *filp);
+static void ipaq_close(struct tty_struct *tty,
+                       struct usb_serial_port *port, struct file *filp);
+static int  ipaq_startup(struct usb_serial *serial);
+static void ipaq_shutdown(struct usb_serial *serial);
+static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
+                       const unsigned char *buf, int count);
+static int ipaq_write_bulk(struct usb_serial_port *port,
+                               const unsigned char *buf, int count);
 static void ipaq_write_gather(struct usb_serial_port *port);
-static void ipaq_read_bulk_callback (struct urb *urb);
+static void ipaq_read_bulk_callback(struct urb *urb);
 static void ipaq_write_bulk_callback(struct urb *urb);
-static int ipaq_write_room(struct usb_serial_port *port);
-static int ipaq_chars_in_buffer(struct usb_serial_port *port);
+static int ipaq_write_room(struct tty_struct *tty);
+static int ipaq_chars_in_buffer(struct tty_struct *tty);
 static void ipaq_destroy_lists(struct usb_serial_port *port);
 
 
@@ -550,7 +552,7 @@ static struct usb_device_id ipaq_id_table [] = {
        { }                             /* Terminating entry */
 };
 
-MODULE_DEVICE_TABLE (usb, ipaq_id_table);
+MODULE_DEVICE_TABLE(usb, ipaq_id_table);
 
 static struct usb_driver ipaq_driver = {
        .name =         "ipaq",
@@ -591,7 +593,8 @@ static spinlock_t   write_list_lock;
 static int             bytes_in;
 static int             bytes_out;
 
-static int ipaq_open(struct usb_serial_port *port, struct file *filp)
+static int ipaq_open(struct tty_struct *tty,
+                       struct usb_serial_port *port, struct file *filp)
 {
        struct usb_serial       *serial = port->serial;
        struct ipaq_private     *priv;
@@ -617,9 +620,9 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
 
        for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
                pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
-               if (pkt == NULL) {
+               if (pkt == NULL)
                        goto enomem;
-               }
+
                pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
                if (pkt->data == NULL) {
                        kfree(pkt);
@@ -637,21 +640,24 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
         * discipline instead of queueing.
         */
 
-       port->tty->low_latency = 1;
-       port->tty->raw = 1;
-       port->tty->real_raw = 1;
-
+       if (tty) {
+               tty->low_latency = 1;
+               /* FIXME: These two are bogus */
+               tty->raw = 1;
+               tty->real_raw = 1;
+       }
        /*
         * Lose the small buffers usbserial provides. Make larger ones.
         */
 
        kfree(port->bulk_in_buffer);
-       kfree(port->bulk_out_buffer);
        port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
        if (port->bulk_in_buffer == NULL) {
                port->bulk_out_buffer = NULL; /* prevent double free */
                goto enomem;
        }
+
+       kfree(port->bulk_out_buffer);
        port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
        if (port->bulk_out_buffer == NULL) {
                kfree(port->bulk_in_buffer);
@@ -661,8 +667,9 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
        port->read_urb->transfer_buffer = port->bulk_in_buffer;
        port->write_urb->transfer_buffer = port->bulk_out_buffer;
        port->read_urb->transfer_buffer_length = URBDATA_SIZE;
-       port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE;
-       
+       port->bulk_out_size = port->write_urb->transfer_buffer_length
+                                                       = URBDATA_SIZE;
+
        msleep(1000*initial_wait);
 
        /*
@@ -691,13 +698,15 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
 
        /* Start reading from the device */
        usb_fill_bulk_urb(port->read_urb, serial->dev,
-                     usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
-                     port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
-                     ipaq_read_bulk_callback, port);
+               usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
+               port->read_urb->transfer_buffer,
+               port->read_urb->transfer_buffer_length,
+               ipaq_read_bulk_callback, port);
 
        result = usb_submit_urb(port->read_urb, GFP_KERNEL);
        if (result) {
-               err("%s - failed submitting read urb, error %d", __func__, result);
+               err("%s - failed submitting read urb, error %d",
+                                               __func__, result);
                goto error;
        }
 
@@ -713,12 +722,13 @@ error:
 }
 
 
-static void ipaq_close(struct usb_serial_port *port, struct file *filp)
+static void ipaq_close(struct tty_struct *tty,
+                       struct usb_serial_port *port, struct file *filp)
 {
        struct ipaq_private     *priv = usb_get_serial_port_data(port);
 
        dbg("%s - port %d", __func__, port->number);
-                        
+
        /*
         * shut down bulk read and write
         */
@@ -728,7 +738,8 @@ static void ipaq_close(struct usb_serial_port *port, struct file *filp)
        kfree(priv);
        usb_set_serial_port_data(port, NULL);
 
-       /* Uncomment the following line if you want to see some statistics in your syslog */
+       /* Uncomment the following line if you want to see some statistics
+        * in your syslog */
        /* info ("Bytes In = %d  Bytes Out = %d", bytes_in, bytes_out); */
 }
 
@@ -748,9 +759,10 @@ static void ipaq_read_bulk_callback(struct urb *urb)
                return;
        }
 
-       usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data);
+       usb_serial_debug_data(debug, &port->dev, __func__,
+                                               urb->actual_length, data);
 
-       tty = port->tty;
+       tty = port->port.tty;
        if (tty && urb->actual_length) {
                tty_buffer_request_room(tty, urb->actual_length);
                tty_insert_flip_string(tty, data, urb->actual_length);
@@ -759,18 +771,20 @@ static void ipaq_read_bulk_callback(struct urb *urb)
        }
 
        /* Continue trying to always read  */
-       usb_fill_bulk_urb(port->read_urb, port->serial->dev, 
-                     usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
-                     port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
-                     ipaq_read_bulk_callback, port);
+       usb_fill_bulk_urb(port->read_urb, port->serial->dev,
+           usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
+           port->read_urb->transfer_buffer,
+           port->read_urb->transfer_buffer_length,
+           ipaq_read_bulk_callback, port);
        result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
        if (result)
-               err("%s - failed resubmitting read urb, error %d", __func__, result);
+               err("%s - failed resubmitting read urb, error %d",
+                                                       __func__, result);
        return;
 }
 
-static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
-                      int count)
+static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
+                       const unsigned char *buf, int count)
 {
        const unsigned char     *current_position = buf;
        int                     bytes_sent = 0;
@@ -780,9 +794,8 @@ static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
 
        while (count > 0) {
                transfer_size = min(count, PACKET_SIZE);
-               if (ipaq_write_bulk(port, current_position, transfer_size)) {
+               if (ipaq_write_bulk(port, current_position, transfer_size))
                        break;
-               }
                current_position += transfer_size;
                bytes_sent += transfer_size;
                count -= transfer_size;
@@ -790,10 +803,10 @@ static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
        }
 
        return bytes_sent;
-} 
+}
 
-static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf,
-                          int count)
+static int ipaq_write_bulk(struct usb_serial_port *port,
+                                       const unsigned char *buf, int count)
 {
        struct ipaq_private     *priv = usb_get_serial_port_data(port);
        struct ipaq_packet      *pkt = NULL;
@@ -830,9 +843,9 @@ static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *bu
                ipaq_write_gather(port);
                spin_unlock_irqrestore(&write_list_lock, flags);
                result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
-               if (result) {
-                       err("%s - failed submitting write urb, error %d", __func__, result);
-               }
+               if (result)
+                       err("%s - failed submitting write urb, error %d",
+                               __func__, result);
        } else {
                spin_unlock_irqrestore(&write_list_lock, flags);
        }
@@ -859,16 +872,15 @@ static void ipaq_write_gather(struct usb_serial_port *port)
                        list_move(&pkt->list, &priv->freelist);
                        priv->free_len += PACKET_SIZE;
                }
-               if (room == 0) {
+               if (room == 0)
                        break;
-               }
        }
 
        count = URBDATA_SIZE - room;
-       usb_fill_bulk_urb(port->write_urb, serial->dev, 
-                     usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
-                     port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback,
-                     port);
+       usb_fill_bulk_urb(port->write_urb, serial->dev,
+               usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
+               port->write_urb->transfer_buffer, count,
+               ipaq_write_bulk_callback, port);
        return;
 }
 
@@ -893,9 +905,9 @@ static void ipaq_write_bulk_callback(struct urb *urb)
                ipaq_write_gather(port);
                spin_unlock_irqrestore(&write_list_lock, flags);
                result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
-               if (result) {
-                       err("%s - failed submitting write urb, error %d", __func__, result);
-               }
+               if (result)
+                       err("%s - failed submitting write urb, error %d",
+                                       __func__, result);
        } else {
                priv->active = 0;
                spin_unlock_irqrestore(&write_list_lock, flags);
@@ -904,16 +916,18 @@ static void ipaq_write_bulk_callback(struct urb *urb)
        usb_serial_port_softint(port);
 }
 
-static int ipaq_write_room(struct usb_serial_port *port)
+static int ipaq_write_room(struct tty_struct *tty)
 {
+       struct usb_serial_port *port = tty->driver_data;
        struct ipaq_private     *priv = usb_get_serial_port_data(port);
 
        dbg("%s - freelen %d", __func__, priv->free_len);
        return priv->free_len;
 }
 
-static int ipaq_chars_in_buffer(struct usb_serial_port *port)
+static int ipaq_chars_in_buffer(struct tty_struct *tty)
 {
+       struct usb_serial_port *port = tty->driver_data;
        struct ipaq_private     *priv = usb_get_serial_port_data(port);
 
        dbg("%s - queuelen %d", __func__, priv->queue_len);
@@ -944,7 +958,7 @@ static int ipaq_startup(struct usb_serial *serial)
                        serial->dev->actconfig->desc.bConfigurationValue);
                return -ENODEV;
        }
-       return usb_reset_configuration (serial->dev);
+       return usb_reset_configuration(serial->dev);
 }
 
 static void ipaq_shutdown(struct usb_serial *serial)
@@ -957,7 +971,7 @@ static int __init ipaq_init(void)
        int retval;
        spin_lock_init(&write_list_lock);
        retval = usb_serial_register(&ipaq_device);
-       if (retval) 
+       if (retval)
                goto failed_usb_serial_register;
        info(DRIVER_DESC " " DRIVER_VERSION);
        if (vendor) {
@@ -967,7 +981,7 @@ static int __init ipaq_init(void)
        retval = usb_register(&ipaq_driver);
        if (retval)
                goto failed_usb_register;
-                 
+
        return 0;
 failed_usb_register:
        usb_serial_deregister(&ipaq_device);
@@ -986,8 +1000,8 @@ static void __exit ipaq_exit(void)
 module_init(ipaq_init);
 module_exit(ipaq_exit);
 
-MODULE_AUTHOR( DRIVER_AUTHOR );
-MODULE_DESCRIPTION( DRIVER_DESC );
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
 
 module_param(debug, bool, S_IRUGO | S_IWUSR);
@@ -1000,7 +1014,9 @@ module_param(product, ushort, 0);
 MODULE_PARM_DESC(product, "User specified USB idProduct");
 
 module_param(connect_retries, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)");
+MODULE_PARM_DESC(connect_retries,
+               "Maximum number of connect retries (one second each)");
 
 module_param(initial_wait, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)");
+MODULE_PARM_DESC(initial_wait,
+               "Time to wait before attempting a connection (in seconds)");