mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-21 19:02:25 +00:00
libxl: support USB controllers in creation time
To support USB Controller in xen guest domains, just add USB controller in domain config xml as following: <controller type='usb' model='qusb2' ports='4'/> Signed-off-by: Chunyan Liu <cyliu@suse.com>
This commit is contained in:
parent
be146b349f
commit
770bf992c6
@ -1479,6 +1479,87 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
|
||||
}
|
||||
|
||||
#ifdef LIBXL_HAVE_PVUSB
|
||||
int
|
||||
libxlMakeUSBController(virDomainControllerDefPtr controller,
|
||||
libxl_device_usbctrl *usbctrl)
|
||||
{
|
||||
usbctrl->devid = controller->idx;
|
||||
|
||||
if (controller->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
|
||||
return -1;
|
||||
|
||||
if (controller->model == -1) {
|
||||
usbctrl->version = 2;
|
||||
usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
|
||||
} else {
|
||||
switch (controller->model) {
|
||||
case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1:
|
||||
usbctrl->version = 1;
|
||||
usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2:
|
||||
usbctrl->version = 2;
|
||||
usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
|
||||
break;
|
||||
|
||||
default:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("unsupported usb model"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (controller->opts.usbopts.ports == -1)
|
||||
usbctrl->ports = 8;
|
||||
else
|
||||
usbctrl->ports = controller->opts.usbopts.ports;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
libxlMakeUSBControllerList(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||
{
|
||||
virDomainControllerDefPtr *l_controllers = def->controllers;
|
||||
size_t ncontrollers = def->ncontrollers;
|
||||
size_t nusbctrls = 0;
|
||||
libxl_device_usbctrl *x_usbctrls;
|
||||
size_t i;
|
||||
|
||||
if (ncontrollers == 0)
|
||||
return 0;
|
||||
|
||||
if (VIR_ALLOC_N(x_usbctrls, ncontrollers) < 0)
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < ncontrollers; i++) {
|
||||
if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
|
||||
continue;
|
||||
|
||||
libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]);
|
||||
|
||||
if (libxlMakeUSBController(l_controllers[i],
|
||||
&x_usbctrls[nusbctrls]) < 0)
|
||||
goto error;
|
||||
|
||||
nusbctrls++;
|
||||
}
|
||||
|
||||
VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls);
|
||||
d_config->usbctrls = x_usbctrls;
|
||||
d_config->num_usbctrls = nusbctrls;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
for (i = 0; i < nusbctrls; i++)
|
||||
libxl_device_usbctrl_dispose(&x_usbctrls[i]);
|
||||
|
||||
VIR_FREE(x_usbctrls);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev)
|
||||
{
|
||||
@ -1751,6 +1832,9 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports,
|
||||
return -1;
|
||||
|
||||
#ifdef LIBXL_HAVE_PVUSB
|
||||
if (libxlMakeUSBControllerList(def, d_config) < 0)
|
||||
return -1;
|
||||
|
||||
if (libxlMakeUSBList(def, d_config) < 0)
|
||||
return -1;
|
||||
#endif
|
||||
|
@ -185,6 +185,10 @@ int
|
||||
libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev);
|
||||
|
||||
# ifdef LIBXL_HAVE_PVUSB
|
||||
int
|
||||
libxlMakeUSBController(virDomainControllerDefPtr controller,
|
||||
libxl_device_usbctrl *usbctrl);
|
||||
|
||||
int
|
||||
libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev);
|
||||
# endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user