Silicon Labs CP2108 USB device can implement up to four COM ports. Each port appears as a separate USB virtual COM interface under the device.
Currently, uslcom(4) always uses the device's first interface, which is wrong when there are multiple ports. The following patch adjusts the driver to use the USB interface that the USB attachment code provides. This makes the different ports usable. dmesg before: uslcom0 at uhub0 port 3 configuration 1 interface 0 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom0 at uslcom0 portno 0 uslcom1 at uhub0 port 3 configuration 1 interface 1 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom1 at uslcom1 portno 0 uslcom2 at uhub0 port 3 configuration 1 interface 2 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom2 at uslcom2 portno 0 uslcom3 at uhub0 port 3 configuration 1 interface 3 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom3 at uslcom3 portno 0 dmesg after: uslcom0 at uhub0 port 3 configuration 1 interface 0 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom0 at uslcom0 portno 0 uslcom1 at uhub0 port 3 configuration 1 interface 1 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom1 at uslcom1 portno 1 uslcom2 at uhub0 port 3 configuration 1 interface 2 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom2 at uslcom2 portno 2 uslcom3 at uhub0 port 3 configuration 1 interface 3 "Silicon Labs CP2108 Quad USB to UART Bridge Controller" rev 2.00/1.70 addr 2 ucom3 at uslcom3 portno 3 OK? Index: share/man/man4/uslcom.4 =================================================================== RCS file: src/share/man/man4/uslcom.4,v retrieving revision 1.15 diff -u -p -r1.15 uslcom.4 --- share/man/man4/uslcom.4 26 Apr 2019 06:02:10 -0000 1.15 +++ share/man/man4/uslcom.4 12 Dec 2021 14:51:03 -0000 @@ -26,12 +26,12 @@ .Sh DESCRIPTION The .Nm -driver supports Silicon Laboratories CP2101/CP2102/CP2103/CP2104/CP2105 +driver supports Silicon Laboratories CP2101/CP2102/CP2103/CP2104/CP2105/CP2108 based serial adapters. .Pp The CP2101/CP2102/CP2103 devices only support a variety of baud rates up to 921600. -CP2104 and CP2105 devices support any baud rate up to 2 Mbps. +CP2104, CP2105 and CP2108 devices support any baud rate up to 2 Mbps. .Pp The following devices should work with the .Nm Index: sys/dev/usb/uslcom.c =================================================================== RCS file: src/sys/dev/usb/uslcom.c,v retrieving revision 1.42 diff -u -p -r1.42 uslcom.c --- sys/dev/usb/uslcom.c 5 Jan 2020 00:54:13 -0000 1.42 +++ sys/dev/usb/uslcom.c 12 Dec 2021 14:51:03 -0000 @@ -38,7 +38,6 @@ int uslcomdebug = 0; #define DPRINTF(x) DPRINTFN(0, x) #define USLCOMBUFSZ 256 -#define USLCOM_IFACE_NO 0 #define USLCOM_SET_DATA_BITS(x) (x << 8) @@ -292,21 +291,11 @@ uslcom_attach(struct device *parent, str struct ucom_attach_args uca; usb_interface_descriptor_t *id; usb_endpoint_descriptor_t *ed; - usbd_status error; int i; bzero(&uca, sizeof(uca)); sc->sc_udev = uaa->device; - - /* get the first interface handle */ - error = usbd_device2interface_handle(sc->sc_udev, USLCOM_IFACE_NO, - &sc->sc_iface); - if (error != 0) { - printf("%s: could not get interface handle\n", - sc->sc_dev.dv_xname); - usbd_deactivate(sc->sc_udev); - return; - } + sc->sc_iface = uaa->iface; id = usbd_get_interface_descriptor(sc->sc_iface); @@ -334,6 +323,7 @@ uslcom_attach(struct device *parent, str return; } + uca.portno = id->bInterfaceNumber; uca.ibufsize = USLCOMBUFSZ; uca.obufsize = USLCOMBUFSZ; uca.ibufsizepad = USLCOMBUFSZ;