I have a pcengines APU 3 system, which has both USB3 and USB2 ports:

ehci0 at pci0 dev 18 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
ehci1 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18

xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi

The USB2 ports seem to be broken. I initially was having trouble getting
an LTE modem to work, but then noticed more general underlying issues.
If a USB device is connected when the system boots, it will find it;
however, if you hot plug a USB device after the system is up, it doesn't
notice. Further, if you unplug a device while the system is up, it
doesn't notice it was removed. It appears that the system isn't
receiving interrupts for the EHCI USB devices, the interrupt count from
vmstat -i :

irq101/ehci0                       19        0
irq101/ehci1                       46        0

does not change when I plug in or remove a device, and I think the
reason the LTE modem is not working is because the cell modem driver never
receives a response from the commands sent to the modem, presumably because
the interrupt notifying the USB driver the data is ready to read is
never seen/handled.

The xhci usb3 ports work fine, they hot plug/remove devices correctly,
the lte modem works when plugged into them, and the vmstat interrupt
count for irq99/xhci0 increases when devices are using those ports.

The EHCI ports seem to work fine under Linux, including the LTE modem
when attached to them, so this seems to be an issue with openbsd, not
faulty hardware per se. The Linux driver does have a couple of
workarounds in their EHCI driver for AMD chipsets, I'm not sure if
either of them are relevant for this; one involves disabling low power
mode during transfers and the other says:

"EHCI controller on AMD SB700/SB800/Hudson-2/3 platforms may
read/write memory space which does not belong to it when
there is NULL pointer with T-bit set to 1 in the frame list
table. To avoid the issue, the frame list link pointer
should always contain a valid pointer to a inactive qh"

I don't see anything specifically discussing flaky interrupts. Any
thoughts on what might be going on here with USB and how it fix it?

Thanks...


Reply via email to