Commit 669a6db1 authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman

USB: ftd_sio: cleanups and updates for new termios work

- Remove can't happen tests
- Rework speed validation in terms of baud rates not CBAUD bits
- Report speed set (or chosen)
- Minor termios correctness
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 9ab0f202
...@@ -294,7 +294,7 @@ struct ftdi_private { ...@@ -294,7 +294,7 @@ struct ftdi_private {
__u16 interface; /* FT2232C port interface (0 for FT232/245) */ __u16 interface; /* FT2232C port interface (0 for FT232/245) */
int force_baud; /* if non-zero, force the baud rate to this value */ speed_t force_baud; /* if non-zero, force the baud rate to this value */
int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */
spinlock_t tx_lock; /* spinlock for transmit state */ spinlock_t tx_lock; /* spinlock for transmit state */
...@@ -878,6 +878,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port) ...@@ -878,6 +878,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
if (div_value == 0) { if (div_value == 0) {
dbg("%s - Baudrate (%d) requested is not supported", __FUNCTION__, baud); dbg("%s - Baudrate (%d) requested is not supported", __FUNCTION__, baud);
div_value = ftdi_sio_b9600; div_value = ftdi_sio_b9600;
baud = 9600;
div_okay = 0; div_okay = 0;
} }
break; break;
...@@ -886,6 +887,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port) ...@@ -886,6 +887,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
div_value = ftdi_232am_baud_to_divisor(baud); div_value = ftdi_232am_baud_to_divisor(baud);
} else { } else {
dbg("%s - Baud rate too high!", __FUNCTION__); dbg("%s - Baud rate too high!", __FUNCTION__);
baud = 9600;
div_value = ftdi_232am_baud_to_divisor(9600); div_value = ftdi_232am_baud_to_divisor(9600);
div_okay = 0; div_okay = 0;
} }
...@@ -899,6 +901,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port) ...@@ -899,6 +901,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
dbg("%s - Baud rate too high!", __FUNCTION__); dbg("%s - Baud rate too high!", __FUNCTION__);
div_value = ftdi_232bm_baud_to_divisor(9600); div_value = ftdi_232bm_baud_to_divisor(9600);
div_okay = 0; div_okay = 0;
baud = 9600;
} }
break; break;
} /* priv->chip_type */ } /* priv->chip_type */
...@@ -909,6 +912,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port) ...@@ -909,6 +912,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
ftdi_chip_name[priv->chip_type]); ftdi_chip_name[priv->chip_type]);
} }
tty_encode_baud_rate(port->tty, baud, baud);
return(div_value); return(div_value);
} }
...@@ -1263,7 +1267,7 @@ static void ftdi_USB_UIRT_setup (struct ftdi_private *priv) ...@@ -1263,7 +1267,7 @@ static void ftdi_USB_UIRT_setup (struct ftdi_private *priv)
priv->flags |= ASYNC_SPD_CUST; priv->flags |= ASYNC_SPD_CUST;
priv->custom_divisor = 77; priv->custom_divisor = 77;
priv->force_baud = B38400; priv->force_baud = 38400;
} /* ftdi_USB_UIRT_setup */ } /* ftdi_USB_UIRT_setup */
/* Setup for the HE-TIRA1 device, which requires hardwired /* Setup for the HE-TIRA1 device, which requires hardwired
...@@ -1274,7 +1278,7 @@ static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv) ...@@ -1274,7 +1278,7 @@ static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv)
priv->flags |= ASYNC_SPD_CUST; priv->flags |= ASYNC_SPD_CUST;
priv->custom_divisor = 240; priv->custom_divisor = 240;
priv->force_baud = B38400; priv->force_baud = 38400;
priv->force_rtscts = 1; priv->force_rtscts = 1;
} /* ftdi_HE_TIRA1_setup */ } /* ftdi_HE_TIRA1_setup */
...@@ -1363,7 +1367,7 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp) ...@@ -1363,7 +1367,7 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
/* ftdi_set_termios will send usb control messages */ /* ftdi_set_termios will send usb control messages */
if (port->tty) if (port->tty)
ftdi_set_termios(port, NULL); ftdi_set_termios(port, port->tty->termios);
/* FIXME: Flow control might be enabled, so it should be checked - /* FIXME: Flow control might be enabled, so it should be checked -
we have no control of defaults! */ we have no control of defaults! */
...@@ -1933,32 +1937,32 @@ static void ftdi_break_ctl( struct usb_serial_port *port, int break_state ) ...@@ -1933,32 +1937,32 @@ static void ftdi_break_ctl( struct usb_serial_port *port, int break_state )
static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old_termios)
{ /* ftdi_termios */ { /* ftdi_termios */
struct usb_device *dev = port->serial->dev; struct usb_device *dev = port->serial->dev;
unsigned int cflag = port->tty->termios->c_cflag;
struct ftdi_private *priv = usb_get_serial_port_data(port); struct ftdi_private *priv = usb_get_serial_port_data(port);
struct ktermios *termios = port->tty->termios;
unsigned int cflag = termios->c_cflag;
__u16 urb_value; /* will hold the new flags */ __u16 urb_value; /* will hold the new flags */
char buf[1]; /* Perhaps I should dynamically alloc this? */ char buf[1]; /* Perhaps I should dynamically alloc this? */
// Added for xon/xoff support // Added for xon/xoff support
unsigned int iflag = port->tty->termios->c_iflag; unsigned int iflag = termios->c_iflag;
unsigned char vstop; unsigned char vstop;
unsigned char vstart; unsigned char vstart;
dbg("%s", __FUNCTION__); dbg("%s", __FUNCTION__);
/* Force baud rate if this device requires it, unless it is set to B0. */ /* Force baud rate if this device requires it, unless it is set to B0. */
if (priv->force_baud && ((port->tty->termios->c_cflag & CBAUD) != B0)) { if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
dbg("%s: forcing baud rate for this device", __FUNCTION__); dbg("%s: forcing baud rate for this device", __FUNCTION__);
port->tty->termios->c_cflag &= ~CBAUD; tty_encode_baud_rate(port->tty, priv->force_baud, priv->force_baud);
port->tty->termios->c_cflag |= priv->force_baud;
} }
/* Force RTS-CTS if this device requires it. */ /* Force RTS-CTS if this device requires it. */
if (priv->force_rtscts) { if (priv->force_rtscts) {
dbg("%s: forcing rtscts for this device", __FUNCTION__); dbg("%s: forcing rtscts for this device", __FUNCTION__);
port->tty->termios->c_cflag |= CRTSCTS; termios->c_cflag |= CRTSCTS;
} }
cflag = port->tty->termios->c_cflag; cflag = termios->c_cflag;
/* FIXME -For this cut I don't care if the line is really changing or /* FIXME -For this cut I don't care if the line is really changing or
not - so just do the change regardless - should be able to not - so just do the change regardless - should be able to
...@@ -1969,6 +1973,8 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old ...@@ -1969,6 +1973,8 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
/* Set number of data bits, parity, stop bits */ /* Set number of data bits, parity, stop bits */
termios->c_cflag &= ~CMSPAR;
urb_value = 0; urb_value = 0;
urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 : urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
FTDI_SIO_SET_DATA_STOP_BITS_1); FTDI_SIO_SET_DATA_STOP_BITS_1);
...@@ -2048,8 +2054,8 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old ...@@ -2048,8 +2054,8 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
// Set the vstart and vstop -- could have been done up above where // Set the vstart and vstop -- could have been done up above where
// a lot of other dereferencing is done but that would be very // a lot of other dereferencing is done but that would be very
// inefficient as vstart and vstop are not always needed // inefficient as vstart and vstop are not always needed
vstart=port->tty->termios->c_cc[VSTART]; vstart = termios->c_cc[VSTART];
vstop=port->tty->termios->c_cc[VSTOP]; vstop = termios->c_cc[VSTOP];
urb_value=(vstop << 8) | (vstart); urb_value=(vstop << 8) | (vstart);
if (usb_control_msg(dev, if (usb_control_msg(dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment