NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/54663: uplcom(4) does not work with EJ168
>Number: 54663
>Category: kern
>Synopsis: uplcom(4) does not work with EJ168
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Oct 30 06:50:00 +0000 2019
>Originator: sc.dying%gmail.com@localhost
>Release: NetBSD/amd64 9.99.17 201910260710Z
>Organization:
>Environment:
System: NetBSD 9.99.17 NetBSD 9.99.17 (GENERIC) #0: Fri Oct 25 18:03:59 UTC 2019 mkrepro%mkrepro.NetBSD.org@localhost:/usr/src/sys/arch/amd64/compile/GENERIC amd64
Architecture: x86_64
Machine: amd64
>Description:
My uplcom(4) is not attached correctly to Etron EJ168 port.
> [ 214.6308845] uplcom0 at uhub5 port 2
> [ 214.6308845] uplcom0: Prolific Technology Inc. (0x67b) USB-Serial Controller (0x2303), rev 1.10/3.00, addr 1
> [ 214.6608972] ucom0 at uplcom0
> [ 214.6608972] ucom0: attach failed, error=5
> [ 214.6608972] ucom0: WARNING: power management not supported
This uplcom has lower BULK-out endpoint address than BULK-in has. [*1]
ucom(4) opens BULK-in endpoint successfully, but fails to open BULK-out
endpoint on EJ168 ports because current xhci driver stores the DCI of the
endpoint to be configued to Context Entries. The Context Entries is
"Maximum DCI of configured endpoint contexts" according to the xhci
specification 4.5.2, otherwise it should fail with Parameter Error.
[*1] lsusb for my uplcom
Bus 001 Device 003: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x067b Prolific Technology, Inc.
idProduct 0x2303 PL2303 Serial Port
bcdDevice 3.00
iManufacturer 1 Prolific Technology Inc.
iProduct 2 USB-Serial Controller
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 39
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x000a 1x 10 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0000
(Bus Powered)
>How-To-Repeat:
Plugin-in the uplcom to EJ168 port that have lower bulk-out endpoint
address than bulk-in has.
>Fix:
Use larger DCI for Context Entries of slot context between given DCI and
Context Entries of output slot context.
I don't think usb_syncmem is required here as xhci_configure_endpoint does
it instead after do_command for output device context.
--- xhci.c 2019-10-11 00:15:13.822142367 +0000
+++ xhci.c 2019-10-11 00:26:26.605295088 +0000
@@ -3094,10 +3094,14 @@ xhci_setup_ctx(struct usbd_pipe *pipe)
cp[1] |= htole32(XHCI_INCTX_1_ADD_MASK(XHCI_DCI_SLOT));
cp[7] = htole32(0);
+ cp = xhci_slot_get_dcv(sc, xs, XHCI_DCI_SLOT);
+ uint32_t entries = XHCI_SCTX_0_CTX_NUM_GET(le32toh(cp[0]));
+ entries = uimax(entries, dci);
+
/* set up input slot context */
cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(XHCI_DCI_SLOT));
cp[0] =
- XHCI_SCTX_0_CTX_NUM_SET(dci) |
+ XHCI_SCTX_0_CTX_NUM_SET(entries) |
XHCI_SCTX_0_SPEED_SET(xhci_speed2xspeed(speed));
cp[1] = 0;
cp[2] = XHCI_SCTX_2_IRQ_TARGET_SET(0);
Home |
Main Index |
Thread Index |
Old Index