diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2008-01-08 09:55:51 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-08 19:16:34 -0500 |
commit | bf5e5834bffc62b50cd4a201804506eb11ef1af8 (patch) | |
tree | 09cd94995a4c67b0fd84f7c81b7f2bb58fac8e50 /drivers/usb | |
parent | cf0594625083111ae522496dc1c256f7476939c2 (diff) |
pl2303: Fix mode switching regression
Cleaning out all the incorrect 'no change made' checks for termios
settings showed up a problem with the PL2303. The hardware here seems to
lose sync and bits if you tell it to make no changes. This shows up with
a real world application.
To fix this the driver check for meaningful hardware changes is restored
but doing the tests correctly and as a tty layer function so it doesn't
get duplicated wrongly everywhere if other drivers turn out to need it.
Signed-off-by: Alan Cox <alan@redhat.com>
Tested-by: Mirko Parthey <mirko.parthey@informatik.tu-chemnitz.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/serial/pl2303.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index cf8add91de05..0da1df9c79bf 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -483,6 +483,13 @@ static void pl2303_set_termios(struct usb_serial_port *port, | |||
483 | } | 483 | } |
484 | spin_unlock_irqrestore(&priv->lock, flags); | 484 | spin_unlock_irqrestore(&priv->lock, flags); |
485 | 485 | ||
486 | /* The PL2303 is reported to lose bytes if you change | ||
487 | serial settings even to the same values as before. Thus | ||
488 | we actually need to filter in this specific case */ | ||
489 | |||
490 | if (!tty_termios_hw_change(port->tty->termios, old_termios)) | ||
491 | return; | ||
492 | |||
486 | cflag = port->tty->termios->c_cflag; | 493 | cflag = port->tty->termios->c_cflag; |
487 | 494 | ||
488 | buf = kzalloc(7, GFP_KERNEL); | 495 | buf = kzalloc(7, GFP_KERNEL); |