Skip to contentSkip to conversation

Revert "USB: serial: ch341: fix character loss at high transfer rates"

PATCH In review Johan Hovold 2 participants 4 messages Aug 24, 2021

Subsystems (3)
lore
Share & tools
lore

Johan Hovold

author maintainer
#0 lore raw

PATCH 1/1 Revert "USB: serial: ch341: fix character loss at high transfer rates"

This reverts commit 3c18e9baee0ef97510dcda78c82285f52626764b.

These devices do not appear to send a zero-length packet when the transfer size is a multiple of the bulk-endpoint max-packet size. This means that incoming data may not be processed by the driver until a short packet is received or the receive buffer is full.

Revert back to using endpoint-sized receive buffers to avoid stalled reads.

Fixes 3c18e9baee0e ("USB: serial: ch341: fix character loss at high transfer rates")
Cc Willy Tarreau <[email protected]>
---
 drivers/usb/serial/ch341.c | 1 -
 1 file changed, 1 deletion(-)
drivers/usb/serial/ch341.c +0 -1
index 8a521b5ea769..2db917eab799 100644
@@ -851,7 +851,6 @@ static struct usb_serial_driver ch341_device = {
 		.owner	= THIS_MODULE,
 		.name	= "ch341-uart",
 	},
-	.bulk_in_size      = 512,
 	.id_table          = id_table,
 	.num_ports         = 1,
 	.open              = ch341_open,
Signature · 1 line
2.31.1
#1 lore raw
Quoted 9 lines · Johan Hovold

This reverts commit 3c18e9baee0ef97510dcda78c82285f52626764b.

These devices do not appear to send a zero-length packet when the transfer size is a multiple of the bulk-endpoint max-packet size. This means that incoming data may not be processed by the driver until a short packet is received or the receive buffer is full.

Revert back to using endpoint-sized receive buffers to avoid stalled reads.

Sorry for this, I didn't notice any issue here (aside for the chip working where it used not to). I have no idea what these zero-length packets correspond to, nor why they're affected by the transfer size. Do you have any idea what I should look for ? Because without that patch, the device is unusable for me :-/

Thanks!
Willy

author maintainer
#2 lore raw
Quoted 8 lines · Willy Tarreau
Quoted 7 lines · Johan Hovold

This reverts commit 3c18e9baee0ef97510dcda78c82285f52626764b.

These devices do not appear to send a zero-length packet when the transfer size is a multiple of the bulk-endpoint max-packet size. This means that incoming data may not be processed by the driver until a short packet is received or the receive buffer is full.

Quoted 8 lines
Quoted 2 lines

Revert back to using endpoint-sized receive buffers to avoid stalled reads.

Sorry for this, I didn't notice any issue here (aside for the chip working where it used not to). I have no idea what these zero-length packets correspond to, nor why they're affected by the transfer size. Do you have any idea what I should look for ? Because without that patch, the device is unusable for me :-/

Zero-length packets are used to indicate completion of bulk transfers that are multiples of the endpoint max-packet size (as per the USB spec). Without those the host controller driver doesn't now that the transfer is complete and that it should call the driver completion callback (and instead waits for the other completion conditions).

It may be possible to configure the device to send ZLPs somehow but since there's no public documentation for the protocol that may require some reverse engineering.

Johan

#3 lore raw

[ removed Cc stable for the rest of the discussion ]

Quoted 5 lines · Johan Hovold

Zero-length packets are used to indicate completion of bulk transfers that are multiples of the endpoint max-packet size (as per the USB spec). Without those the host controller driver doesn't now that the transfer is complete and that it should call the driver completion callback (and instead waits for the other completion conditions).

Thanks for the explanation. I guess that in my case, given that the serial port would emit lots of continuous data (e.g. "find /" or "dmesg"), there's always something pending and the risk that it ends exactly on a 64-byte boundary remained low and never happened in practice.

Quoted 3 lines

It may be possible to configure the device to send ZLPs somehow but since there's no public documentation for the protocol that may require some reverse engineering.

I totally understand. I'll drop my CH34x adapters and try to figure more suitable ones (i.e. some which work *by default* under Linux). Their small footprint was nice but without doc they're only usable for low speeds :-/

Thanks!
Willy