diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2007-06-22 14:36:29 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 16:34:37 -0700 |
commit | 568c24adeaa4d9ec2fd04c6ae226eeb673a385db (patch) | |
tree | a86aa556a093474530f8957d211c876a4c121c56 /drivers/usb | |
parent | 9e85c5f63268a5700860f53e52b090973652a5b2 (diff) |
USB: serial: ark3116.c: Mixed fixups
o Don't parse the cflag for baud rates, its not valid to do so
any more and this driver got it wrong anyway
o Don't do clever termios change checks in drivers and get them
wrong (arguably we should do some smart ones in the tty core but
stty to change nothing is *not* a common or critical path
I don't have the hardware so if you can test this carefully please do. I
thought fixing it up this far was better than marking it and other bits of
USB serial && BROKEN
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/serial/ark3116.c | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index fe437125f14..c9fd486c1c7 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -172,7 +172,7 @@ static void ark3116_set_termios(struct usb_serial_port *port, dbg("%s - port %d", __FUNCTION__, port->number); - if ((!port->tty) || (!port->tty->termios)) { + if (!port->tty || !port->tty->termios) { dbg("%s - no tty structures", __FUNCTION__); return; } @@ -188,16 +188,6 @@ static void ark3116_set_termios(struct usb_serial_port *port, cflag = port->tty->termios->c_cflag; - /* check that they really want us to change something: */ - if (old_termios) { - if ((cflag == old_termios->c_cflag) && - (RELEVANT_IFLAG(port->tty->termios->c_iflag) == - RELEVANT_IFLAG(old_termios->c_iflag))) { - dbg("%s - nothing to change...", __FUNCTION__); - return; - } - } - buf = kmalloc(1, GFP_KERNEL); if (!buf) { dbg("error kmalloc"); @@ -220,7 +210,7 @@ static void ark3116_set_termios(struct usb_serial_port *port, dbg("setting CS7"); break; default: - err("CSIZE was set but not CS5-CS8, using CS8!"); + dbg("CSIZE was set but not CS5-CS8, using CS8!"); /* fall through */ case CS8: config |= 0x03; @@ -251,38 +241,33 @@ static void ark3116_set_termios(struct usb_serial_port *port, } /* set baudrate */ - baud = 0; - switch (cflag & CBAUD) { - case B0: - err("can't set 0 baud, using 9600 instead"); + baud = tty_get_baud_rate(port->tty); + + switch (baud) { + case 75: + case 150: + case 300: + case 600: + case 1200: + case 1800: + case 2400: + case 4800: + case 9600: + case 19200: + case 38400: + case 57600: + case 115200: + case 230400: + case 460800: break; - case B75: baud = 75; break; - case B150: baud = 150; break; - case B300: baud = 300; break; - case B600: baud = 600; break; - case B1200: baud = 1200; break; - case B1800: baud = 1800; break; - case B2400: baud = 2400; break; - case B4800: baud = 4800; break; - case B9600: baud = 9600; break; - case B19200: baud = 19200; break; - case B38400: baud = 38400; break; - case B57600: baud = 57600; break; - case B115200: baud = 115200; break; - case B230400: baud = 230400; break; - case B460800: baud = 460800; break; + /* set 9600 as default (if given baudrate is invalid for example) */ default: - dbg("does not support the baudrate requested (fix it)"); - break; + baud = 9600; } - /* set 9600 as default (if given baudrate is invalid for example) */ - if (baud == 0) - baud = 9600; - /* * found by try'n'error, be careful, maybe there are other options - * for multiplicator etc! + * for multiplicator etc! (3.5 for example) */ if (baud == 460800) /* strange, for 460800 the formula is wrong |