On Fri, Aug 26, 2011 at 01:44:23AM +0300, Marc-André Lureau wrote:
Companion controllers take an extra 'master' attribute to
associate
them.
Changes since v1:
- use the same bus index for companion controllers
- removed the master bus attribute, redundant with controller index
---
docs/formatdomain.html.in | 22 ++++++++++++
docs/schemas/domain.rng | 12 +++++++
src/conf/domain_conf.c | 35 ++++++++++++++++++++
src/conf/domain_conf.h | 18 ++++++++++
src/qemu/qemu_command.c | 11 ++++++-
.../qemuxml2argv-input-usbmouse-addr.args | 2 +-
.../qemuxml2argv-usb-ich9-companion.args | 6 +++
.../qemuxml2argv-usb-ich9-companion.xml | 30 +++++++++++++++++
tests/qemuxml2argvtest.c | 3 ++
9 files changed, 137 insertions(+), 2 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 5552fbc..633cea1 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1243,6 +1243,28 @@
sub-element.
</p>
+ <p>
+ USB companion controllers have an optional
+ sub-element <code><master></code> to specify the exact
+ relationship of the companion to its master controller.
+ A companion controller is on the same bus as its master, so
+ the companion <code>index</code> value should be equal.
+ </p>
+
+<pre>
+ ...
+ <devices>
+ <controller type='usb' index='0'
model='ich9-ehci1'>
+ <address type='pci' domain='0' bus='0'
slot='4' function='7'/>
+ </controller>
+ <controller type='usb' index='0'
model='ich9-uhci1'>
+ <master startport='0'/>
+ <address type='pci' domain='0' bus='0'
slot='4' function='0'/>
+ </controller>
+ ...
+ </devices>
+ ...</pre>
+
<h4><a name="elementsLease">Device
leases</a></h4>
<p>
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index 632e029..455f57d 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -923,6 +923,9 @@
</attribute>
</optional>
<optional>
+ <ref name="usbmaster"/>
+ </optional>
+ <optional>
<ref name="address"/>
</optional>
</element>
@@ -2378,6 +2381,15 @@
</element>
</define>
+ <define name="usbmaster">
+ <element name="master">
+ <attribute name="startport">
+ <ref name="usbAddr"/>
+ </attribute>
+ <empty/>
+ </element>
+ </define>
+
<define name="filterref-node-attributes">
<attribute name="filter">
<data type="NCName"/>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 5487e0e..5ef062a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1832,6 +1832,31 @@ cleanup:
return ret;
}
+static int
+virDomainDeviceUSBMasterParseXML(xmlNodePtr node,
+ virDomainDeviceUSBMasterPtr master)
+{
+ char *startport;
+ int ret = -1;
+
+ memset(master, 0, sizeof(*master));
+
+ startport = virXMLPropString(node, "startport");
+
+ if (startport &&
+ virStrToLong_ui(startport, NULL, 10, &master->startport) < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse <master> 'startport'
attribute"));
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+ VIR_FREE(startport);
+ return ret;
+}
+
/* Parse the XML definition for a device address
* @param node XML nodeset to parse for device address definition
*/
@@ -1842,6 +1867,7 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
{
xmlNodePtr cur;
xmlNodePtr address = NULL;
+ xmlNodePtr master = NULL;
xmlNodePtr alias = NULL;
char *type = NULL;
int ret = -1;
@@ -1858,6 +1884,9 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
} else if (address == NULL &&
xmlStrEqual(cur->name, BAD_CAST "address")) {
address = cur;
+ } else if (master == NULL &&
+ xmlStrEqual(cur->name, BAD_CAST "master")) {
+ master = cur;
}
}
cur = cur->next;
@@ -1866,6 +1895,12 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
if (alias)
info->alias = virXMLPropString(alias, "name");
+ if (master) {
+ info->mastertype = VIR_DOMAIN_CONTROLLER_MASTER_USB;
+ if (virDomainDeviceUSBMasterParseXML(master, &info->master.usb) < 0)
+ goto cleanup;
+ }
+
if (!address)
return 0;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 1ad8071..07d60a4 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -113,6 +113,20 @@ struct _virDomainDeviceUSBAddress {
unsigned int port;
};
+enum virDomainControllerMaster {
+ VIR_DOMAIN_CONTROLLER_MASTER_NONE,
+ VIR_DOMAIN_CONTROLLER_MASTER_USB,
+
+ VIR_DOMAIN_CONTROLLER_MASTER_LAST
+};
+
+typedef struct _virDomainDeviceUSBMaster virDomainDeviceUSBMaster;
+typedef virDomainDeviceUSBMaster *virDomainDeviceUSBMasterPtr;
+struct _virDomainDeviceUSBMaster {
+ unsigned int bus;
+ unsigned int startport;
+};
The 'bus' field is now unused, so can be removed here I believe.
ACK aside from that
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|