File e01d300b-libxl-usb-vendor.patch of Package libvirt.11509
From e01d300bb1b2185536c81858e4e707e1f16a4c9e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= <cbosdonnat@suse.com>
Date: Wed, 10 Aug 2016 18:39:12 -0600
Subject: [PATCH 2/2] libxl: allow vendor/product addressing for USB hostdevs
libxl only has API to address the host USB devices by bus/device.
Find the bus/device if the user only provided the vendor/product
of the USB device.
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
---
src/libxl/libxl_conf.c | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
Index: libvirt-2.0.0/src/libxl/libxl_conf.c
===================================================================
--- libvirt-2.0.0.orig/src/libxl/libxl_conf.c
+++ libvirt-2.0.0/src/libxl/libxl_conf.c
@@ -1519,23 +1519,36 @@ int
libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev)
{
virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
+ virUSBDevicePtr usb = NULL;
+ int ret = -1;
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
- return -1;
+ return ret;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
- return -1;
+ return ret;
- if (usbsrc->bus <= 0 || usbsrc->device <= 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("libxenlight supports only USB device "
- "specified by busnum:devnum"));
- return -1;
+ if (usbsrc->bus > 0 && usbsrc->device > 0) {
+ usbdev->u.hostdev.hostbus = usbsrc->bus;
+ usbdev->u.hostdev.hostaddr = usbsrc->device;
+ } else {
+ if (virHostdevFindUSBDevice(hostdev, true, &usb) < 0) {
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("failed to find USB device busnum:devnum "
+ "for %x:%x"),
+ usbsrc->vendor, usbsrc->product);
+ goto cleanup;
+ }
+
+ usbdev->u.hostdev.hostbus = virUSBDeviceGetBus(usb);
+ usbdev->u.hostdev.hostaddr = virUSBDeviceGetDevno(usb);
}
- usbdev->u.hostdev.hostbus = usbsrc->bus;
- usbdev->u.hostdev.hostaddr = usbsrc->device;
+ ret = 0;
+
+ cleanup:
+ virUSBDeviceFree(usb);
- return 0;
+ return ret;
}
static int