]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/serial/digi_acceleport.c
tty: The big operations rework
[linux-2.6-omap-h63xx.git] / drivers / usb / serial / digi_acceleport.c
index dab2e66d111dbb8692fe717615965784cc110b31..04a56f300ea68059ce54d7f803408737562855ab 100644 (file)
@@ -508,9 +508,6 @@ static struct usb_serial_driver digi_acceleport_2_device = {
        .description =                  "Digi 2 port USB adapter",
        .usb_driver =                   &digi_driver,
        .id_table =                     id_table_2,
-       .num_interrupt_in =             0,
-       .num_bulk_in =                  4,
-       .num_bulk_out =                 4,
        .num_ports =                    3,
        .open =                         digi_open,
        .close =                        digi_close,
@@ -538,9 +535,6 @@ static struct usb_serial_driver digi_acceleport_4_device = {
        .description =                  "Digi 4 port USB adapter",
        .usb_driver =                   &digi_driver,
        .id_table =                     id_table_4,
-       .num_interrupt_in =             0,
-       .num_bulk_in =                  5,
-       .num_bulk_out =                 5,
        .num_ports =                    4,
        .open =                         digi_open,
        .close =                        digi_close,
@@ -665,7 +659,7 @@ static int digi_write_oob_command(struct usb_serial_port *port,
        }
        spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
        if (ret)
-               err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__, ret);
+               err("%s: usb_submit_urb failed, ret=%d", __func__, ret);
        return ret;
 
 }
@@ -746,7 +740,7 @@ static int digi_write_inb_command(struct usb_serial_port *port,
 
        if (ret)
                err("%s: usb_submit_urb failed, ret=%d, port=%d",
-                       __FUNCTION__, ret, priv->dp_port_num);
+                       __func__, ret, priv->dp_port_num);
        return ret;
 }
 
@@ -810,7 +804,7 @@ static int digi_set_modem_signals(struct usb_serial_port *port,
        spin_unlock(&port_priv->dp_port_lock);
        spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
        if (ret)
-               err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__, ret);
+               err("%s: usb_submit_urb failed, ret=%d", __func__, ret);
        return ret;
 }
 
@@ -903,7 +897,7 @@ static void digi_rx_unthrottle(struct usb_serial_port *port)
 
        if (ret)
                err("%s: usb_submit_urb failed, ret=%d, port=%d",
-                       __FUNCTION__, ret, priv->dp_port_num);
+                       __func__, ret, priv->dp_port_num);
 }
 
 
@@ -973,6 +967,8 @@ static void digi_set_termios(struct usb_serial_port *port,
                }
        }
        /* set parity */
+       tty->termios->c_cflag &= ~CMSPAR;
+
        if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) {
                if (cflag&PARENB) {
                        if (cflag&PARODD)
@@ -1054,15 +1050,15 @@ static void digi_set_termios(struct usb_serial_port *port,
        }
 
        /* set output flow control */
-       if ((iflag&IXON) != (old_iflag&IXON)
-           || (cflag&CRTSCTS) != (old_cflag&CRTSCTS)) {
+       if ((iflag & IXON) != (old_iflag & IXON)
+           || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
                arg = 0;
-               if (iflag&IXON)
+               if (iflag & IXON)
                        arg |= DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
                else
                        arg &= ~DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
 
-               if (cflag&CRTSCTS) {
+               if (cflag & CRTSCTS) {
                        arg |= DIGI_OUTPUT_FLOW_CONTROL_CTS;
                } else {
                        arg &= ~DIGI_OUTPUT_FLOW_CONTROL_CTS;
@@ -1076,8 +1072,8 @@ static void digi_set_termios(struct usb_serial_port *port,
        }
 
        /* set receive enable/disable */
-       if ((cflag&CREAD) != (old_cflag&CREAD)) {
-               if (cflag&CREAD)
+       if ((cflag & CREAD) != (old_cflag & CREAD)) {
+               if (cflag & CREAD)
                        arg = DIGI_ENABLE;
                else
                        arg = DIGI_DISABLE;
@@ -1089,7 +1085,7 @@ static void digi_set_termios(struct usb_serial_port *port,
        }
        if ((ret = digi_write_oob_command(port, buf, i, 1)) != 0)
                dbg("digi_set_termios: write oob failed, ret=%d", ret);
-
+       tty_encode_baud_rate(tty, baud, baud);
 }
 
 
@@ -1111,7 +1107,7 @@ static int digi_tiocmget(struct usb_serial_port *port, struct file *file)
        unsigned int val;
        unsigned long flags;
 
-       dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
+       dbg("%s: TOP: port=%d", __func__, priv->dp_port_num);
 
        spin_lock_irqsave(&priv->dp_port_lock, flags);
        val = priv->dp_modem_signals;
@@ -1127,7 +1123,7 @@ static int digi_tiocmset(struct usb_serial_port *port, struct file *file,
        unsigned int val;
        unsigned long flags;
 
-       dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
+       dbg("%s: TOP: port=%d", __func__, priv->dp_port_num);
 
        spin_lock_irqsave(&priv->dp_port_lock, flags);
        val = (priv->dp_modem_signals & ~clear) | set;
@@ -1222,7 +1218,7 @@ static int digi_write(struct usb_serial_port *port, const unsigned char *buf, in
        spin_unlock_irqrestore(&priv->dp_port_lock, flags);
        if (ret < 0)
                err("%s: usb_submit_urb failed, ret=%d, port=%d",
-                       __FUNCTION__, ret, priv->dp_port_num);
+                       __func__, ret, priv->dp_port_num);
        dbg("digi_write: returning %d", ret);
        return ret;
 
@@ -1231,7 +1227,7 @@ static int digi_write(struct usb_serial_port *port, const unsigned char *buf, in
 static void digi_write_bulk_callback(struct urb *urb)
 {
 
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct usb_serial *serial;
        struct digi_port *priv;
        struct digi_serial *serial_priv;
@@ -1243,13 +1239,13 @@ static void digi_write_bulk_callback(struct urb *urb)
        /* port and serial sanity check */
        if (port == NULL || (priv=usb_get_serial_port_data(port)) == NULL) {
                err("%s: port or port->private is NULL, status=%d",
-                   __FUNCTION__, status);
+                   __func__, status);
                return;
        }
        serial = port->serial;
        if (serial == NULL || (serial_priv=usb_get_serial_data(serial)) == NULL) {
                err("%s: serial or serial->private is NULL, status=%d",
-                   __FUNCTION__, status);
+                   __func__, status);
                return;
        }
 
@@ -1290,7 +1286,7 @@ static void digi_write_bulk_callback(struct urb *urb)
        spin_unlock(&priv->dp_port_lock);
        if (ret)
                err("%s: usb_submit_urb failed, ret=%d, port=%d",
-                       __FUNCTION__, ret, priv->dp_port_num);
+                       __func__, ret, priv->dp_port_num);
 }
 
 static int digi_write_room(struct usb_serial_port *port)
@@ -1403,19 +1399,19 @@ static void digi_close(struct usb_serial_port *port, struct file *filp)
        unsigned char buf[32];
        struct tty_struct *tty = port->tty;
        struct digi_port *priv = usb_get_serial_port_data(port);
-       unsigned long flags = 0;
 
        dbg("digi_close: TOP: port=%d, open_count=%d",
                priv->dp_port_num, port->open_count);
 
+       mutex_lock(&port->serial->disc_mutex);
        /* if disconnected, just clear flags */
-       if (!usb_get_intfdata(port->serial->interface))
+       if (port->serial->disconnected)
                goto exit;
 
        /* do cleanup only after final close on this port */
-       spin_lock_irqsave(&priv->dp_port_lock, flags);
+       spin_lock_irq(&priv->dp_port_lock);
        priv->dp_in_close = 1;
-       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       spin_unlock_irq(&priv->dp_port_lock);
 
        /* tell line discipline to process only XON/XOFF */
        tty->closing = 1;
@@ -1425,8 +1421,7 @@ static void digi_close(struct usb_serial_port *port, struct file *filp)
                tty_wait_until_sent(tty, DIGI_CLOSE_TIMEOUT);
 
        /* flush driver and line discipline buffers */
-       if (tty->driver->flush_buffer)
-               tty->driver->flush_buffer(tty);
+       tty_driver_flush_buffer(tty);
        tty_ldisc_flush(tty);
 
        if (port->serial->dev) {
@@ -1480,11 +1475,12 @@ static void digi_close(struct usb_serial_port *port, struct file *filp)
        }
        tty->closing = 0;
 exit:
-       spin_lock_irqsave(&priv->dp_port_lock, flags);
+       spin_lock_irq(&priv->dp_port_lock);
        priv->dp_write_urb_in_use = 0;
        priv->dp_in_close = 0;
        wake_up_interruptible(&priv->dp_close_wait);
-       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       spin_unlock_irq(&priv->dp_port_lock);
+       mutex_unlock(&port->serial->disc_mutex);
        dbg("digi_close: done");
 }
 
@@ -1518,7 +1514,7 @@ static int digi_startup_device(struct usb_serial *serial)
                port->write_urb->dev = port->serial->dev;
                if ((ret = usb_submit_urb(port->read_urb, GFP_KERNEL)) != 0) {
                        err("%s: usb_submit_urb failed, ret=%d, port=%d",
-                                       __FUNCTION__, ret, i);
+                                       __func__, ret, i);
                        break;
                }
        }
@@ -1608,7 +1604,7 @@ static void digi_shutdown(struct usb_serial *serial)
 
 static void digi_read_bulk_callback(struct urb *urb)
 {
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct digi_port *priv;
        struct digi_serial *serial_priv;
        int ret;
@@ -1619,20 +1615,20 @@ static void digi_read_bulk_callback(struct urb *urb)
        /* port sanity check, do not resubmit if port is not valid */
        if (port == NULL || (priv = usb_get_serial_port_data(port)) == NULL) {
                err("%s: port or port->private is NULL, status=%d",
-                   __FUNCTION__, status);
+                   __func__, status);
                return;
        }
        if (port->serial == NULL ||
                (serial_priv=usb_get_serial_data(port->serial)) == NULL) {
                err("%s: serial is bad or serial->private is NULL, status=%d",
-                       __FUNCTION__, status);
+                       __func__, status);
                return;
        }
 
        /* do not resubmit urb if it has any status error */
        if (status) {
                err("%s: nonzero read bulk status: status=%d, port=%d",
-                   __FUNCTION__, status, priv->dp_port_num);
+                   __func__, status, priv->dp_port_num);
                return;
        }
 
@@ -1649,7 +1645,7 @@ static void digi_read_bulk_callback(struct urb *urb)
        urb->dev = port->serial->dev;
        if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
                err("%s: failed resubmitting urb, ret=%d, port=%d",
-                   __FUNCTION__, ret, priv->dp_port_num);
+                   __func__, ret, priv->dp_port_num);
        }
 
 }
@@ -1667,7 +1663,7 @@ static void digi_read_bulk_callback(struct urb *urb)
 static int digi_read_inb_callback(struct urb *urb)
 {
 
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct tty_struct *tty = port->tty;
        struct digi_port *priv = usb_get_serial_port_data(port);
        int opcode = ((unsigned char *)urb->transfer_buffer)[0];
@@ -1687,7 +1683,7 @@ static int digi_read_inb_callback(struct urb *urb)
        if (urb->actual_length != len + 2) {
                err("%s: INCOMPLETE OR MULTIPLE PACKET, urb->status=%d, "
                    "port=%d, opcode=%d, len=%d, actual_length=%d, "
-                   "status=%d", __FUNCTION__, status, priv->dp_port_num,
+                   "status=%d", __func__, status, priv->dp_port_num,
                    opcode, len, urb->actual_length, port_status);
                return -1;
        }
@@ -1736,9 +1732,9 @@ static int digi_read_inb_callback(struct urb *urb)
        spin_unlock(&priv->dp_port_lock);
 
        if (opcode == DIGI_CMD_RECEIVE_DISABLE)
-               dbg("%s: got RECEIVE_DISABLE", __FUNCTION__);
+               dbg("%s: got RECEIVE_DISABLE", __func__);
        else if (opcode != DIGI_CMD_RECEIVE_DATA)
-               dbg("%s: unknown opcode: %d", __FUNCTION__, opcode);
+               dbg("%s: unknown opcode: %d", __func__, opcode);
 
        return(throttled ? 1 : 0);
 
@@ -1757,7 +1753,7 @@ static int digi_read_inb_callback(struct urb *urb)
 static int digi_read_oob_callback(struct urb *urb)
 {
 
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct usb_serial *serial = port->serial;
        struct digi_port *priv = usb_get_serial_port_data(port);
        int opcode, line, status, val;