aboutsummaryrefslogtreecommitdiffstats
path: root/hw/usb-bus.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-12-10 11:43:35 +0100
committerGerd Hoffmann <kraxel@redhat.com>2011-01-11 17:27:44 +0100
commit5f69076b8dda325dcbbc87bdb00e04ffac0f6137 (patch)
tree7f9803cede8852118e1d452db8b41942a23992d8 /hw/usb-bus.c
parentc7a2196a4fcdaba977b99aca0b6a6de5e5e7f64a (diff)
usb: add port property.
This allows to explictily set the physical port where you want to plug the usb device. Example: -device usb-tablet,bus=usb.0,port=2 With explicit port addressing qemu can and will not automagically add USB Hubs. This means that: (a) You can plug two devices of your choice into the two uhci root ports. (b) If you want plug in more that two devices you have to care about adding a hub yourself. Plugging a hub works this way: -device usb-hub,bus=usb.0,port=1 Use this to add a device to the hub: -device usb-tablet,bus=usb.0,port=1.1 Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb-bus.c')
-rw-r--r--hw/usb-bus.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/hw/usb-bus.c b/hw/usb-bus.c
index 0cb03c913..1f59f9a94 100644
--- a/hw/usb-bus.c
+++ b/hw/usb-bus.c
@@ -15,6 +15,10 @@ static struct BusInfo usb_bus_info = {
.print_dev = usb_bus_dev_print,
.get_dev_path = usb_get_dev_path,
.get_fw_dev_path = usbbus_get_fw_dev_path,
+ .props = (Property[]) {
+ DEFINE_PROP_STRING("port", USBDevice, port_path),
+ DEFINE_PROP_END_OF_LIST()
+ },
};
static int next_usb_bus = 0;
static QTAILQ_HEAD(, USBBus) busses = QTAILQ_HEAD_INITIALIZER(busses);
@@ -157,9 +161,22 @@ static void do_attach(USBDevice *dev)
dev->product_desc);
return;
}
- dev->attached++;
+ if (dev->port_path) {
+ QTAILQ_FOREACH(port, &bus->free, next) {
+ if (strcmp(port->path, dev->port_path) == 0) {
+ break;
+ }
+ }
+ if (port == NULL) {
+ fprintf(stderr, "Warning: usb port %s (bus %s) not found\n",
+ dev->port_path, bus->qbus.name);
+ return;
+ }
+ } else {
+ port = QTAILQ_FIRST(&bus->free);
+ }
- port = QTAILQ_FIRST(&bus->free);
+ dev->attached++;
QTAILQ_REMOVE(&bus->free, port, next);
bus->nfree--;
@@ -173,8 +190,9 @@ int usb_device_attach(USBDevice *dev)
{
USBBus *bus = usb_bus_from_device(dev);
- if (bus->nfree == 1) {
- /* Create a new hub and chain it on. */
+ if (bus->nfree == 1 && dev->port_path == NULL) {
+ /* Create a new hub and chain it on
+ (unless a physical port location is specified). */
usb_create_simple(bus, "usb-hub");
}
do_attach(dev);