]> err.no Git - linux-2.6/blobdiff - drivers/usb/serial/keyspan.c
Pull bugzilla-9345 into release branch
[linux-2.6] / drivers / usb / serial / keyspan.c
index fa91ddee24584dee6c6db125c6b9d26108f330c8..feba9679ace8b35103fc7ac0315adefdf97b855f 100644 (file)
@@ -278,29 +278,35 @@ static void keyspan_set_termios (struct usb_serial_port *port,
        struct keyspan_port_private     *p_priv;
        const struct keyspan_device_details     *d_details;
        unsigned int                    cflag;
+       struct tty_struct               *tty = port->tty;
 
        dbg("%s", __FUNCTION__); 
 
        p_priv = usb_get_serial_port_data(port);
        d_details = p_priv->device_details;
-       cflag = port->tty->termios->c_cflag;
+       cflag = tty->termios->c_cflag;
        device_port = port->number - port->serial->minor;
 
        /* Baud rate calculation takes baud rate as an integer
           so other rates can be generated if desired. */
-       baud_rate = tty_get_baud_rate(port->tty);
+       baud_rate = tty_get_baud_rate(tty);
        /* If no match or invalid, don't change */              
-       if (baud_rate >= 0
-           && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
+       if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
                                NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
                /* FIXME - more to do here to ensure rate changes cleanly */
+               /* FIXME - calcuate exact rate from divisor ? */
                p_priv->baud = baud_rate;
-       }
+       } else
+               baud_rate = tty_termios_baud_rate(old_termios);
 
+       tty_encode_baud_rate(tty, baud_rate, baud_rate);
        /* set CTS/RTS handshake etc. */
        p_priv->cflag = cflag;
        p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
 
+       /* Mark/Space not supported */
+       tty->termios->c_cflag &= ~CMSPAR;
+
        keyspan_send_setup(port, 0);
 }
 
@@ -427,14 +433,15 @@ static void       usa26_indat_callback(struct urb *urb)
        struct usb_serial_port  *port;
        struct tty_struct       *tty;
        unsigned char           *data = urb->transfer_buffer;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__); 
 
        endpoint = usb_pipeendpoint(urb->pipe);
 
-       if (urb->status) {
+       if (status) {
                dbg("%s - nonzero status: %x on endpoint %d.",
-                   __FUNCTION__, urb->status, endpoint);
+                   __FUNCTION__, status, endpoint);
                return;
        }
 
@@ -519,11 +526,12 @@ static void       usa26_instat_callback(struct urb *urb)
        struct usb_serial_port                  *port;
        struct keyspan_port_private             *p_priv;
        int old_dcd_state, err;
+       int status = urb->status;
 
        serial = (struct usb_serial *) urb->context;
 
-       if (urb->status) {
-               dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
+       if (status) {
+               dbg("%s - nonzero status: %x", __FUNCTION__, status);
                return;
        }
        if (urb->actual_length != 9) {
@@ -587,6 +595,7 @@ static void usa28_indat_callback(struct urb *urb)
        struct tty_struct       *tty;
        unsigned char           *data;
        struct keyspan_port_private             *p_priv;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__);
 
@@ -598,9 +607,9 @@ static void usa28_indat_callback(struct urb *urb)
                return;
 
        do {
-               if (urb->status) {
+               if (status) {
                        dbg("%s - nonzero status: %x on endpoint %d.",
-                           __FUNCTION__, urb->status, usb_pipeendpoint(urb->pipe));
+                           __FUNCTION__, status, usb_pipeendpoint(urb->pipe));
                        return;
                }
 
@@ -656,11 +665,12 @@ static void       usa28_instat_callback(struct urb *urb)
        struct usb_serial_port                  *port;
        struct keyspan_port_private             *p_priv;
        int old_dcd_state;
+       int status = urb->status;
 
        serial = (struct usb_serial *) urb->context;
 
-       if (urb->status) {
-               dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
+       if (status) {
+               dbg("%s - nonzero status: %x", __FUNCTION__, status);
                return;
        }
 
@@ -747,13 +757,14 @@ static void       usa49_instat_callback(struct urb *urb)
        struct usb_serial_port                  *port;
        struct keyspan_port_private             *p_priv;
        int old_dcd_state;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__);
 
        serial = (struct usb_serial *) urb->context;
 
-       if (urb->status) {
-               dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
+       if (status) {
+               dbg("%s - nonzero status: %x", __FUNCTION__, status);
                return;
        }
 
@@ -813,14 +824,15 @@ static void       usa49_indat_callback(struct urb *urb)
        struct usb_serial_port  *port;
        struct tty_struct       *tty;
        unsigned char           *data = urb->transfer_buffer;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__);
 
        endpoint = usb_pipeendpoint(urb->pipe);
 
-       if (urb->status) {
+       if (status) {
                dbg("%s - nonzero status: %x on endpoint %d.", __FUNCTION__,
-                   urb->status, endpoint);
+                   status, endpoint);
                return;
        }
 
@@ -865,13 +877,14 @@ static void usa49wg_indat_callback(struct urb *urb)
        struct usb_serial_port  *port;
        struct tty_struct       *tty;
        unsigned char           *data = urb->transfer_buffer;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__);
 
        serial = urb->context;
 
-       if (urb->status) {
-               dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
+       if (status) {
+               dbg("%s - nonzero status: %x", __FUNCTION__, status);
                return;
        }
 
@@ -948,14 +961,15 @@ static void usa90_indat_callback(struct urb *urb)
        struct keyspan_port_private             *p_priv;
        struct tty_struct       *tty;
        unsigned char           *data = urb->transfer_buffer;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__); 
 
        endpoint = usb_pipeendpoint(urb->pipe);
 
-       if (urb->status) {
+       if (status) {
                dbg("%s - nonzero status: %x on endpoint %d.",
-                   __FUNCTION__, urb->status, endpoint);
+                   __FUNCTION__, status, endpoint);
                return;
        }
 
@@ -1021,11 +1035,12 @@ static void     usa90_instat_callback(struct urb *urb)
        struct usb_serial_port                  *port;
        struct keyspan_port_private             *p_priv;
        int old_dcd_state, err;
+       int status = urb->status;
 
        serial = (struct usb_serial *) urb->context;
 
-       if (urb->status) {
-               dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
+       if (status) {
+               dbg("%s - nonzero status: %x", __FUNCTION__, status);
                return;
        }
        if (urb->actual_length < 14) {
@@ -1088,13 +1103,14 @@ static void     usa67_instat_callback(struct urb *urb)
        struct usb_serial_port                  *port;
        struct keyspan_port_private             *p_priv;
        int old_dcd_state;
+       int status = urb->status;
 
        dbg ("%s", __FUNCTION__);
 
        serial = urb->context;
 
-       if (urb->status) {
-               dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
+       if (status) {
+               dbg("%s - nonzero status: %x", __FUNCTION__, status);
                return;
        }
 
@@ -1211,8 +1227,8 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
        s_priv = usb_get_serial_data(serial);
        p_priv = usb_get_serial_port_data(port);
        d_details = p_priv->device_details;
-       
-       dbg("%s - port%d.", __FUNCTION__, port->number); 
+
+       dbg("%s - port%d.", __FUNCTION__, port->number);
 
        /* Set some sane defaults */
        p_priv->rts_state = 1;
@@ -1233,7 +1249,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
                urb->dev = serial->dev;
 
                /* make sure endpoint data toggle is synchronized with the device */
-               
+
                usb_clear_halt(urb->dev, urb->pipe);
 
                if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) {
@@ -1249,7 +1265,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
                /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */
        }
 
-       /* get the terminal config for the setup message now so we don't 
+       /* get the terminal config for the setup message now so we don't
         * need to send 2 of them */
 
        cflag = port->tty->termios->c_cflag;
@@ -1258,7 +1274,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
        /* Baud rate calculation takes baud rate as an integer
           so other rates can be generated if desired. */
        baud_rate = tty_get_baud_rate(port->tty);
-       /* If no match or invalid, leave as default */          
+       /* If no match or invalid, leave as default */
        if (baud_rate >= 0
            && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
                                NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {