The ch341 driver is based on reverse-engineering and contains some bits which appear to be redundant and some which appear incompatible which certain devices. Specifically, some CH340 devices seem unable to change the initial line settings, which have so far been set to 5N1. Let's use a more reasonable 8N1 default instead. Note that we also need to set the ENABLE_RX bit or receive will be disabled after a reset during resume. Also drop a redundant LCR-register read. Fixes: 6ce76104781a ("USB: Driver for CH341 USB-serial adaptor") Cc: stable <stable@xxxxxxxxxxxxxxx> Signed-off-by: Johan Hovold <johan@xxxxxxxxxx> --- drivers/usb/serial/ch341.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c index cbe91b232828..3d86272a4b31 100644 --- a/drivers/usb/serial/ch341.c +++ b/drivers/usb/serial/ch341.c @@ -203,6 +203,7 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv) char *buffer; int r; const unsigned size = 8; + u8 lcr; buffer = kmalloc(size, GFP_KERNEL); if (!buffer) @@ -218,12 +219,12 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv) if (r < 0) goto out; - /* expect two bytes 0x56 0x00 */ - r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x2518, 0, buffer, size); - if (r < 0) - goto out; - - r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x2518, 0x0050); + /* + * Some CH340 devices appear unable to change the initial LCR + * settings, so set a sane 8N1 default. + */ + lcr = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8; + r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x2518, lcr); if (r < 0) goto out; @@ -232,7 +233,7 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv) if (r < 0) goto out; - r = ch341_init_set_baudrate(dev, priv, 0); + r = ch341_init_set_baudrate(dev, priv, lcr); if (r < 0) goto out; -- 2.10.2 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html