]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxl: allow vendor/product addressing for USB hostdevs
authorCédric Bosdonnat <cbosdonnat@suse.com>
Thu, 11 Aug 2016 00:39:12 +0000 (18:39 -0600)
committerCédric Bosdonnat <cbosdonnat@suse.com>
Fri, 2 Sep 2016 15:38:15 +0000 (17:38 +0200)
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

index 5202ca12deb3bc19ffadd8cc0e9dce2787ec72fd..5ba59b052f5015506e058069ba4fdb3a4233e087 100644 (file)
@@ -1559,23 +1559,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;
 
-    return 0;
+ cleanup:
+    virUSBDeviceFree(usb);
+
+    return ret;
 }
 
 static int