Takashi Iwai bc4a20
From 979d9cbe75b922ab1695b8ad5576115774f72e62 Mon Sep 17 00:00:00 2001
Takashi Iwai bc4a20
From: Johan Hovold <johan@kernel.org>
Takashi Iwai bc4a20
Date: Mon, 11 Jan 2021 18:00:19 +0100
Takashi Iwai bc4a20
Subject: [PATCH] USB: serial: pl2303: fix line-speed handling on newer chips
Takashi Iwai bc4a20
Git-commit: 979d9cbe75b922ab1695b8ad5576115774f72e62
Takashi Iwai bc4a20
Patch-mainline: v5.12-rc1
Takashi Iwai bc4a20
References: bsc#1186320
Takashi Iwai bc4a20
Takashi Iwai bc4a20
The latest chip family (HXN) apparently does not support setting the
Takashi Iwai bc4a20
line speed using divisors and instead needs to use the direct encoding
Takashi Iwai bc4a20
scheme for all rates.
Takashi Iwai bc4a20
Takashi Iwai bc4a20
This specifically enables 50, 110, 134, 200 bps and other rates not
Takashi Iwai bc4a20
supported by the original chip type.
Takashi Iwai bc4a20
Takashi Iwai bc4a20
Fixes: ebd09f1cd417 ("USB: serial: pl2303: add support for PL2303HXN")
Takashi Iwai bc4a20
Cc: stable@vger.kernel.org      # 5.5
Takashi Iwai bc4a20
Cc: Charles Yeh <charlesyeh522@gmail.com>
Takashi Iwai bc4a20
Signed-off-by: Johan Hovold <johan@kernel.org>
Takashi Iwai bc4a20
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai bc4a20
Takashi Iwai bc4a20
---
Takashi Iwai bc4a20
 drivers/usb/serial/pl2303.c | 8 +++++++-
Takashi Iwai bc4a20
 1 file changed, 7 insertions(+), 1 deletion(-)
Takashi Iwai bc4a20
Takashi Iwai bc4a20
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
Takashi Iwai bc4a20
index be8067017eaa..29dda60e3bcd 100644
Takashi Iwai bc4a20
--- a/drivers/usb/serial/pl2303.c
Takashi Iwai bc4a20
+++ b/drivers/usb/serial/pl2303.c
Takashi Iwai bc4a20
@@ -183,6 +183,7 @@ struct pl2303_type_data {
Takashi Iwai bc4a20
 	speed_t max_baud_rate;
Takashi Iwai bc4a20
 	unsigned long quirks;
Takashi Iwai bc4a20
 	unsigned int no_autoxonxoff:1;
Takashi Iwai bc4a20
+	unsigned int no_divisors:1;
Takashi Iwai bc4a20
 };
Takashi Iwai bc4a20
 
Takashi Iwai bc4a20
 struct pl2303_serial_private {
Takashi Iwai bc4a20
@@ -209,6 +210,7 @@ static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
Takashi Iwai bc4a20
 	},
Takashi Iwai bc4a20
 	[TYPE_HXN] = {
Takashi Iwai bc4a20
 		.max_baud_rate		= 12000000,
Takashi Iwai bc4a20
+		.no_divisors		= true,
Takashi Iwai bc4a20
 	},
Takashi Iwai bc4a20
 };
Takashi Iwai bc4a20
 
Takashi Iwai bc4a20
@@ -571,8 +573,12 @@ static void pl2303_encode_baud_rate(struct tty_struct *tty,
Takashi Iwai bc4a20
 		baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
Takashi Iwai bc4a20
 	/*
Takashi Iwai bc4a20
 	 * Use direct method for supported baud rates, otherwise use divisors.
Takashi Iwai bc4a20
+	 * Newer chip types do not support divisor encoding.
Takashi Iwai bc4a20
 	 */
Takashi Iwai bc4a20
-	baud_sup = pl2303_get_supported_baud_rate(baud);
Takashi Iwai bc4a20
+	if (spriv->type->no_divisors)
Takashi Iwai bc4a20
+		baud_sup = baud;
Takashi Iwai bc4a20
+	else
Takashi Iwai bc4a20
+		baud_sup = pl2303_get_supported_baud_rate(baud);
Takashi Iwai bc4a20
 
Takashi Iwai bc4a20
 	if (baud == baud_sup)
Takashi Iwai bc4a20
 		baud = pl2303_encode_baud_rate_direct(buf, baud);
Takashi Iwai bc4a20
-- 
Takashi Iwai bc4a20
2.26.2
Takashi Iwai bc4a20