On Tue, Jun 01, 2021 at 12:18:27PM -0500, Alex Villacís Lasso wrote:
El 1/6/21 a las 10:40, Johan Hovold escribió:
Could you try applying the below patch, and with debugging enabled
1. plug the device in
2. start the terminal program
and then send me the logs?
This should show the current device settings which appear to have flow
control enabled (which the driver fails to disable).
Thanks again for the log.
$ miniterm.py /dev/ttyUSB0 115200
Traceback (most recent call last):
File "/usr/bin/miniterm.py", line 976, in <module>
main()
File "/usr/bin/miniterm.py", line 932, in main
serial_instance.open()
File "/usr/lib/python3.9/site-packages/serial/serialposix.py", line
288, in open
self._update_rts_state()
File "/usr/lib/python3.9/site-packages/serial/serialposix.py", line
627, in _update_rts_state
fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_RTS_str)
BrokenPipeError: [Errno 32] Broken pipe
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_change_speed - setting baud rate to 9600
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_set_flow_control - ctrl = 0x00, flow = 0x00
So the default device settings are the same as for my device and
hardware flow control is disabled.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_set_flow_control - xon_limit = 0, xoff_limit = 0
Defaults to zero here too.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_set_flow_control - ctrl = 0x00, flow = 0x01
Here IXON is enabled (default termios), but the IXOFF limits are also
updated to 128/128.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_tiocmset_port - control = 0x0303
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0: failed set request
0x7 status: -32
And the next SET_MHS (modem handshaking) request fails (for RTS, as can
be seen below).
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_change_speed - setting baud rate to 115384
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_set_flow_control - ctrl = 0x00, flow = 0x01
The requested settings appear to have taken effect.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_set_flow_control - xon_limit = 128, xoff_limit = 128
And the limits have been updated.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_set_flow_control - ctrl = 0x01, flow = 0x40
Here DTR and RTS are asserted, and flow control disabled.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_tiocmset_port - control = 0x0101
DTR can still be changed.
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0:
cp210x_tiocmset_port - control = 0x0202
jun 01 12:12:13 karlalex-asus kernel: cp210x ttyUSB0: failed set request
0x7 status: -32
But RTS cannot be changed, just as if auto-RTS is enabled (even if it is
not reported back).
This may be a little far-fetched but can you send me the logs (debugging
again enabled) from when:
1. plugging the device in
2. stty -F /dev/ttyUSB0 ixon ixoff
3. stty -F /dev/ttyUSB0 crtscts -ixon -ixoff
4. cat /dev/ttyUSB0 # + CTRL-C
No need to run the terminal program.
If you could also apply the below debugging patch (on top of the
previous one) which will dump some device settings during probe before
doing the above that would be great.
Hopefully this will gives some more clues but otherwise I'll probably
just leave the default IXOFF limits for CP2102N to fix the regression.
Johan
From 65b53f408b5d6b6408420ed9d1c827f80401796e Mon Sep 17 00:00:00 2001
From: Johan Hovold <johan@xxxxxxxxxx>
Date: Wed, 2 Jun 2021 16:23:21 +0200
Subject: [PATCH] USB: serial: cp210x: dump communication properties
---
drivers/usb/serial/cp210x.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index 89da00de9739..f5c9e21538f8 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -1843,6 +1843,37 @@ static void cp210x_gpio_remove(struct usb_serial *serial)
#endif
+static void cp210x_dump_props(struct usb_serial_port *port)
+{
+ struct usb_device *udev = port->serial->dev;
+ void *buf;
+ int ret;
+
+ buf = kzalloc(256, GFP_KERNEL);
+ if (!buf)
+ return;
+
+ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+ CP210X_GET_PROPS, REQTYPE_INTERFACE_TO_HOST, 0,
+ cp210x_interface_num(port->serial), buf, 256,
+ USB_CTRL_GET_TIMEOUT);
+ if (ret < 52) {
+ dev_err(&port->dev, "failed to get props: %d\n", ret);
+ goto out;
+ }
+
+ dev_dbg(&port->dev, "wLength = %u\n", le16_to_cpup(buf));
+ dev_dbg(&port->dev, "ulMaxTxQueue = %u\n", le32_to_cpup(buf + 12));
+ dev_dbg(&port->dev, "ulMaxRxQueue = %u\n", le32_to_cpup(buf + 16));
+ dev_dbg(&port->dev, "ulProvSubType = %u\n", le32_to_cpup(buf + 24));
+ dev_dbg(&port->dev, "ulProvCapabilities = 0x%02x\n", le32_to_cpup(buf + 28));
+ dev_dbg(&port->dev, "ulSettableParams = 0x%02x\n", le32_to_cpup(buf + 32));
+ dev_dbg(&port->dev, "ulCurrentTx-Queue = %u\n", le32_to_cpup(buf + 44));
+ dev_dbg(&port->dev, "ulCurrentRx-Queue = %u\n", le32_to_cpup(buf + 48));
+out:
+ kfree(buf);
+}
+
static int cp210x_port_probe(struct usb_serial_port *port)
{
struct usb_serial *serial = port->serial;
@@ -1857,6 +1888,8 @@ static int cp210x_port_probe(struct usb_serial_port *port)
usb_set_serial_port_data(port, port_priv);
+ cp210x_dump_props(port);
+
return 0;
}