diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2012-01-10 16:59:28 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2012-02-10 11:31:48 +0100 |
commit | 73796fe6228ae1e294b4946c6c90337141cacc42 (patch) | |
tree | 3fadff48cc8a9e0595832c94147bd6d6af2a05aa /hw/usb.c | |
parent | 70fc20d4dc7c8990a508411db1ee441ae9ee5034 (diff) |
usb: add usb_find_device()
Add usb_find_device(). This function will check whenever a device with
a specific address is connected to the specified port. Usually this
will just check state and address of the device hooked up to the port,
but in case of a hub it will ask the hub to check all hub ports for a
matching device.
This patch doesn't put the code into use yet, see the following patches
for details.
The master plan is to separate device lookup and packet processing.
Right now the usb code simply walks all devices, calls
usb_handle_packet() on each until one accepts the packet (by returning
something different that USB_RET_NODEV). I want to have a device lookup
first, then call usb_handle_packet() once, for the device which actually
processes the packet.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb.c')
-rw-r--r-- | hw/usb.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -295,6 +295,19 @@ int set_usb_string(uint8_t *buf, const char *str) return q - buf; } +USBDevice *usb_find_device(USBPort *port, uint8_t addr) +{ + USBDevice *dev = port->dev; + + if (dev == NULL || !dev->attached || dev->state != USB_STATE_DEFAULT) { + return NULL; + } + if (dev->addr == addr) { + return dev; + } + return usb_device_find_device(dev, addr); +} + /* Hand over a packet to a device for processing. Return value USB_RET_ASYNC indicates the processing isn't finished yet, the driver will call usb_packet_complete() when done processing it. */ |