A slightly less hacky work around for USB v1 passthrough based on the issue I created:
--- /opt/xensource/libexec/usb_scan.py 2019-11-04 10:03:02.000000000 +0000
+++ /tmp/usb_scan.py 2020-03-01 17:32:29.266317478 +0000
@@ -152,10 +152,11 @@
_CLASS = "bDeviceClass"
_CONF_VALUE = "bConfigurationValue"
_NUM_INTERFACES = "bNumInterfaces"
+ _USB_SPEED = "speed"
_PRODUCT_DESC = [_DESC_VENDOR, _DESC_PRODUCT]
_PRODUCT_DETAILS = [_VERSION, _ID_VENDOR, _ID_PRODUCT, _BCD_DEVICE, _SERIAL,
- _CLASS, _CONF_VALUE, _NUM_INTERFACES]
+ _CLASS, _CONF_VALUE, _NUM_INTERFACES, _USB_SPEED]
_PROPS = _PRODUCT_DESC + _PRODUCT_DETAILS
_PROPS_NONABLE = _PRODUCT_DESC + [_SERIAL]
@@ -590,7 +591,10 @@
pusb["path"] = device.get_node()
# strip the leading space of "version"
- pusb["version"] = device[UsbDevice._VERSION].strip()
+ if int(device[UsbDevice._USB_SPEED]) <= 12:
+ pusb["version"] = "1.00"
+ else:
+ pusb["version"] = device[UsbDevice._VERSION].strip()
pusb["vendor-id"] = device[UsbDevice._ID_VENDOR]
pusb["product-id"] = device[UsbDevice._ID_PRODUCT]
pusb["vendor-desc"] = device[UsbDevice._DESC_VENDOR]
in theory any deice which is "low" or "full" speed (i.e. USB1) will have it's version number changed to 1.00 which forces xenopsd to use a USB1 bus. It may have side effects if the driver in the guest relies on the version number so caveat emptor.