USB: mct232: speed, new termios and compliance cleanups
Signed-off-by: Alan Cox <alan@redhat.com> Cc: Pete Zaitcev <zaitcev@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
e7806e366b
commit
d0fab0ddf3
|
@ -182,10 +182,11 @@ struct mct_u232_private {
|
||||||
/*
|
/*
|
||||||
* Later day 2.6.0-test kernels have new baud rates like B230400 which
|
* Later day 2.6.0-test kernels have new baud rates like B230400 which
|
||||||
* we do not know how to support. We ignore them for the moment.
|
* we do not know how to support. We ignore them for the moment.
|
||||||
* XXX Rate-limit the error message, it's user triggerable.
|
|
||||||
*/
|
*/
|
||||||
static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value)
|
static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value, speed_t *result)
|
||||||
{
|
{
|
||||||
|
*result = value;
|
||||||
|
|
||||||
if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
|
if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
|
||||||
|| le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
|
|| le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
|
@ -200,11 +201,13 @@ static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value
|
||||||
case 57600: return 0x0b;
|
case 57600: return 0x0b;
|
||||||
case 115200: return 0x0c;
|
case 115200: return 0x0c;
|
||||||
default:
|
default:
|
||||||
err("MCT USB-RS232: unsupported baudrate request 0x%x,"
|
*result = 9600;
|
||||||
" using default of B9600", value);
|
|
||||||
return 0x08;
|
return 0x08;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/* FIXME: Can we use any divider - should we do
|
||||||
|
divider = 115200/value;
|
||||||
|
real baud = 115200/divider */
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 300: break;
|
case 300: break;
|
||||||
case 600: break;
|
case 600: break;
|
||||||
|
@ -217,9 +220,8 @@ static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value
|
||||||
case 57600: break;
|
case 57600: break;
|
||||||
case 115200: break;
|
case 115200: break;
|
||||||
default:
|
default:
|
||||||
err("MCT USB-RS232: unsupported baudrate request 0x%x,"
|
|
||||||
" using default of B9600", value);
|
|
||||||
value = 9600;
|
value = 9600;
|
||||||
|
*result = 9600;
|
||||||
}
|
}
|
||||||
return 115200/value;
|
return 115200/value;
|
||||||
}
|
}
|
||||||
|
@ -232,16 +234,19 @@ static int mct_u232_set_baud_rate(struct usb_serial *serial, struct usb_serial_p
|
||||||
int rc;
|
int rc;
|
||||||
unsigned char zero_byte = 0;
|
unsigned char zero_byte = 0;
|
||||||
unsigned char cts_enable_byte = 0;
|
unsigned char cts_enable_byte = 0;
|
||||||
|
speed_t speed;
|
||||||
|
|
||||||
divisor = cpu_to_le32(mct_u232_calculate_baud_rate(serial, value));
|
divisor = cpu_to_le32(mct_u232_calculate_baud_rate(serial, value, &speed));
|
||||||
|
|
||||||
rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
|
rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
|
||||||
MCT_U232_SET_BAUD_RATE_REQUEST,
|
MCT_U232_SET_BAUD_RATE_REQUEST,
|
||||||
MCT_U232_SET_REQUEST_TYPE,
|
MCT_U232_SET_REQUEST_TYPE,
|
||||||
0, 0, &divisor, MCT_U232_SET_BAUD_RATE_SIZE,
|
0, 0, &divisor, MCT_U232_SET_BAUD_RATE_SIZE,
|
||||||
WDR_TIMEOUT);
|
WDR_TIMEOUT);
|
||||||
if (rc < 0)
|
if (rc < 0) /*FIXME: What value speed results */
|
||||||
err("Set BAUD RATE %d failed (error = %d)", value, rc);
|
err("Set BAUD RATE %d failed (error = %d)", value, rc);
|
||||||
|
else
|
||||||
|
tty_encode_baud_rate(port->tty, speed, speed);
|
||||||
dbg("set_baud_rate: value: 0x%x, divisor: 0x%x", value, divisor);
|
dbg("set_baud_rate: value: 0x%x, divisor: 0x%x", value, divisor);
|
||||||
|
|
||||||
/* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
|
/* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
|
||||||
|
@ -608,7 +613,8 @@ static void mct_u232_set_termios (struct usb_serial_port *port,
|
||||||
{
|
{
|
||||||
struct usb_serial *serial = port->serial;
|
struct usb_serial *serial = port->serial;
|
||||||
struct mct_u232_private *priv = usb_get_serial_port_data(port);
|
struct mct_u232_private *priv = usb_get_serial_port_data(port);
|
||||||
unsigned int cflag = port->tty->termios->c_cflag;
|
struct ktermios *termios = port->tty->termios;
|
||||||
|
unsigned int cflag = termios->c_cflag;
|
||||||
unsigned int old_cflag = old_termios->c_cflag;
|
unsigned int old_cflag = old_termios->c_cflag;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int control_state;
|
unsigned int control_state;
|
||||||
|
@ -670,6 +676,8 @@ static void mct_u232_set_termios (struct usb_serial_port *port,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
termios->c_cflag &= ~CMSPAR;
|
||||||
|
|
||||||
/* set the number of stop bits */
|
/* set the number of stop bits */
|
||||||
last_lcr |= (cflag & CSTOPB) ?
|
last_lcr |= (cflag & CSTOPB) ?
|
||||||
MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
|
MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
* and "Intel solution". They are the regular MCT and "Sitecom" for us.
|
* and "Intel solution". They are the regular MCT and "Sitecom" for us.
|
||||||
* This is pointless to document in the header, see the code for the bits.
|
* This is pointless to document in the header, see the code for the bits.
|
||||||
*/
|
*/
|
||||||
static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value);
|
static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value, speed_t *result);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Line Control Register (LCR)
|
* Line Control Register (LCR)
|
||||||
|
|
Loading…
Reference in New Issue