Hi, Sometimes uchcom(4) looks Rx jammed. Here is the movie (at Mastodon) that the problem has occured: https://social.tchncs.de/@uaa/107637913051446044
Receiving an exact wMaxPacketSize bytes bulk packet from CH34x causes this problem, because this means USB transaction is not finished. uchcom(4)'s ibufsize for ucom(4) is too large, it should be same as wMaxPacketsize for bulk-in endpoint. Here's the diff. Index: uchcom.c =================================================================== RCS file: /cvs/src/sys/dev/usb/uchcom.c,v retrieving revision 1.31 diff -u -p -r1.31 uchcom.c --- uchcom.c 19 Nov 2021 07:58:34 -0000 1.31 +++ uchcom.c 17 Jan 2022 12:21:55 -0000 @@ -113,7 +113,6 @@ int uchcomdebug = 0; #define UCHCOM_RESET_VALUE 0x501F /* line mode? */ #define UCHCOM_RESET_INDEX 0xD90A /* baud rate? */ -#define UCHCOMIBUFSIZE 256 #define UCHCOMOBUFSIZE 256 struct uchcom_softc @@ -141,6 +140,7 @@ struct uchcom_softc struct uchcom_endpoints { int ep_bulkin; + int ep_bulkin_size; int ep_bulkout; int ep_intr; int ep_intr_size; @@ -293,9 +293,9 @@ uchcom_attach(struct device *parent, str uca.portno = UCOM_UNK_PORTNO; uca.bulkin = endpoints.ep_bulkin; uca.bulkout = endpoints.ep_bulkout; - uca.ibufsize = UCHCOMIBUFSIZE; + uca.ibufsize = endpoints.ep_bulkin_size; uca.obufsize = UCHCOMOBUFSIZE; - uca.ibufsizepad = UCHCOMIBUFSIZE; + uca.ibufsizepad = endpoints.ep_bulkin_size; uca.opkthdrlen = 0; uca.device = dev; uca.iface = sc->sc_iface; @@ -349,7 +349,7 @@ int uchcom_find_endpoints(struct uchcom_softc *sc, struct uchcom_endpoints *endpoints) { - int i, bin=-1, bout=-1, intr=-1, isize=0; + int i, bin=-1, bout=-1, intr=-1, binsize=0, isize=0; usb_interface_descriptor_t *id; usb_endpoint_descriptor_t *ed; @@ -370,6 +370,7 @@ uchcom_find_endpoints(struct uchcom_soft } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { bin = ed->bEndpointAddress; + binsize = UGETW(ed->wMaxPacketSize); } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { bout = ed->bEndpointAddress; @@ -402,6 +403,7 @@ uchcom_find_endpoints(struct uchcom_soft endpoints->ep_intr = intr; endpoints->ep_intr_size = isize; endpoints->ep_bulkin = bin; + endpoints->ep_bulkin_size = binsize; endpoints->ep_bulkout = bout; return 0; -- SASANO Takayoshi (JG1UAA) <u...@mx5.nisiq.net>