Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0fab0dd authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman
Browse files

USB: mct232: speed, new termios and compliance cleanups



Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Cc: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e7806e36
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -182,10 +182,11 @@ struct mct_u232_private {
/*
 * 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.
 * 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
	  || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
		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 115200: return 0x0c;
		default:
			err("MCT USB-RS232: unsupported baudrate request 0x%x,"
			    " using default of B9600", value);
			*result = 9600;
			return 0x08;
		}
	} else {
		/* FIXME: Can we use any divider - should we do
		   divider = 115200/value;
		   real baud = 115200/divider */
		switch (value) {
		case 300: 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 115200: break;
		default:
			err("MCT USB-RS232: unsupported baudrate request 0x%x,"
			    " using default of B9600", value);
			value = 9600;
			*result = 9600;
		}
		return 115200/value;
	}
@@ -232,16 +234,19 @@ static int mct_u232_set_baud_rate(struct usb_serial *serial, struct usb_serial_p
        int rc;
        unsigned char zero_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),
                             MCT_U232_SET_BAUD_RATE_REQUEST,
			     MCT_U232_SET_REQUEST_TYPE,
                             0, 0, &divisor, MCT_U232_SET_BAUD_RATE_SIZE,
			     WDR_TIMEOUT);
	if (rc < 0)
	if (rc < 0)	/*FIXME: What value speed results */
		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);

	/* 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 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 long flags;
	unsigned int control_state;
@@ -670,6 +676,8 @@ static void mct_u232_set_termios (struct usb_serial_port *port,
		break;
	}

	termios->c_cflag &= ~CMSPAR;

	/* set the number of stop bits */
	last_lcr |= (cflag & CSTOPB) ?
		MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@
 * 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.
 */
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)