usb-hub: implement find_device

Implement the find_device callback for the usb hub.  It'll loop over all
ports, calling usb_find_device for all enabled ports until it finds a
matching device.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2012-01-10 17:08:13 +01:00
parent 73796fe622
commit 06c750888c
1 changed files with 21 additions and 0 deletions

View File

@ -220,6 +220,26 @@ static void usb_hub_complete(USBPort *port, USBPacket *packet)
s->dev.port->ops->complete(s->dev.port, packet); s->dev.port->ops->complete(s->dev.port, packet);
} }
static USBDevice *usb_hub_find_device(USBDevice *dev, uint8_t addr)
{
USBHubState *s = DO_UPCAST(USBHubState, dev, dev);
USBHubPort *port;
USBDevice *downstream;
int i;
for (i = 0; i < NUM_PORTS; i++) {
port = &s->ports[i];
if (!(port->wPortStatus & PORT_STAT_ENABLE)) {
continue;
}
downstream = usb_find_device(&port->port, addr);
if (downstream != NULL) {
return downstream;
}
}
return NULL;
}
static void usb_hub_handle_reset(USBDevice *dev) static void usb_hub_handle_reset(USBDevice *dev)
{ {
USBHubState *s = DO_UPCAST(USBHubState, dev, dev); USBHubState *s = DO_UPCAST(USBHubState, dev, dev);
@ -541,6 +561,7 @@ static void usb_hub_class_initfn(ObjectClass *klass, void *data)
uc->init = usb_hub_initfn; uc->init = usb_hub_initfn;
uc->product_desc = "QEMU USB Hub"; uc->product_desc = "QEMU USB Hub";
uc->usb_desc = &desc_hub; uc->usb_desc = &desc_hub;
uc->find_device = usb_hub_find_device;
uc->handle_packet = usb_hub_handle_packet; uc->handle_packet = usb_hub_handle_packet;
uc->handle_reset = usb_hub_handle_reset; uc->handle_reset = usb_hub_handle_reset;
uc->handle_control = usb_hub_handle_control; uc->handle_control = usb_hub_handle_control;