On Sat, 2 Apr 2016 19:07:16 +0200 Grigori Goronzy <g...@chown.ath.cx> wrote:
> With the new reinitialization method, configuring parity, different > frame lengths and different stop bit settings work as expected on > both CH340G and CH341A. This has been extensively tested with a > logic analyzer. > > Tested-by: Ryan Barber <r...@skyscraper.nu> > Signed-off-by: Grigori Goronzy <g...@chown.ath.cx> > --- > drivers/usb/serial/ch341.c | 36 ++++++++++++++++++++++++++++++------ > 1 file changed, 30 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c > index c001773..4d66f0f 100644 > --- a/drivers/usb/serial/ch341.c > +++ b/drivers/usb/serial/ch341.c > @@ -346,6 +346,7 @@ static void ch341_set_termios(struct tty_struct *tty, > unsigned baud_rate; > unsigned long flags; > unsigned char ctrl; > + unsigned cflag = tty->termios.c_cflag; > int r; > > /* redundant changes may cause the chip to lose bytes */ > @@ -356,7 +357,35 @@ static void ch341_set_termios(struct tty_struct *tty, > > priv->baud_rate = baud_rate; > > - ctrl = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8; > + ctrl = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX; > + > + switch (cflag & CSIZE) { > + case CS5: > + ctrl |= CH341_LCR_CS5; > + break; > + case CS6: > + ctrl |= CH341_LCR_CS6; > + break; > + case CS7: > + ctrl |= CH341_LCR_CS7; > + break; > + case CS8: > + default: > + ctrl |= CH341_LCR_CS8; In the default case tty-.termios.c_cflag should also be updated to show CS8 Alan