qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PATCH 07/28] usb: add usb_find_device()
Date: Fri, 10 Feb 2012 12:43:03 +0100	[thread overview]
Message-ID: <1328874204-20920-8-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1328874204-20920-1-git-send-email-kraxel@redhat.com>

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>
---
 hw/usb-bus.c |    9 +++++++++
 hw/usb.c     |   13 +++++++++++++
 hw/usb.h     |   10 ++++++++++
 3 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/hw/usb-bus.c b/hw/usb-bus.c
index b753834..5c05ed5 100644
--- a/hw/usb-bus.c
+++ b/hw/usb-bus.c
@@ -74,6 +74,15 @@ static int usb_device_init(USBDevice *dev)
     return 0;
 }
 
+USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
+{
+    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    if (klass->find_device) {
+        return klass->find_device(dev, addr);
+    }
+    return NULL;
+}
+
 static void usb_device_handle_destroy(USBDevice *dev)
 {
     USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
diff --git a/hw/usb.c b/hw/usb.c
index 0c26164..bacdc81 100644
--- a/hw/usb.c
+++ b/hw/usb.c
@@ -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. */
diff --git a/hw/usb.h b/hw/usb.h
index 6127176..1beb4b3 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -229,6 +229,12 @@ typedef struct USBDeviceClass {
     int (*init)(USBDevice *dev);
 
     /*
+     * Walk (enabled) downstream ports, check for a matching device.
+     * Only hubs implement this.
+     */
+    USBDevice *(*find_device)(USBDevice *dev, uint8_t addr);
+
+    /*
      * Process USB packet.
      * Called by the HC (Host Controller).
      *
@@ -332,6 +338,8 @@ void usb_packet_copy(USBPacket *p, void *ptr, size_t bytes);
 void usb_packet_skip(USBPacket *p, size_t bytes);
 void usb_packet_cleanup(USBPacket *p);
 
+USBDevice *usb_find_device(USBPort *port, uint8_t addr);
+
 int usb_handle_packet(USBDevice *dev, USBPacket *p);
 void usb_packet_complete(USBDevice *dev, USBPacket *p);
 void usb_cancel_packet(USBPacket * p);
@@ -446,6 +454,8 @@ extern const VMStateDescription vmstate_usb_device;
     .offset     = vmstate_offset_value(_state, _field, USBDevice),   \
 }
 
+USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr);
+
 int usb_device_handle_packet(USBDevice *dev, USBPacket *p);
 
 void usb_device_cancel_packet(USBDevice *dev, USBPacket *p);
-- 
1.7.1

  parent reply	other threads:[~2012-02-10 11:43 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-10 11:42 [Qemu-devel] [PULL 00/28] usb patch queue Gerd Hoffmann
2012-02-10 11:42 ` [Qemu-devel] [PATCH 01/28] usb-uhci: implement bandwidth management Gerd Hoffmann
2012-02-10 11:42 ` [Qemu-devel] [PATCH 02/28] usb-ehci: Clear the portstatus powner bit on device disconnect Gerd Hoffmann
2012-02-10 11:42 ` [Qemu-devel] [PATCH 03/28] usb-redir: Add the posibility to filter out certain devices from redirecion Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 04/28] usb: kill USB_MSG_{ATTACH,DETACH} Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 05/28] usb: kill USB_MSG_RESET Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 06/28] usb: kill usb_send_msg Gerd Hoffmann
2012-02-10 11:43 ` Gerd Hoffmann [this message]
2012-02-10 11:43 ` [Qemu-devel] [PATCH 08/28] usb-hub: implement find_device Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 09/28] usb: handle dev == NULL in usb_handle_packet() Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 10/28] usb-uhci: switch to usb_find_device() Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 11/28] usb-ehci: " Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 12/28] usb-ohci: " Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 13/28] usb-musb: " Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 14/28] usb-xhci: " Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 15/28] usb: kill handle_packet callback Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 16/28] usb: fold usb_generic_handle_packet into usb_handle_packet Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 17/28] usb: USBPacket: add status, rename owner -> ep Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 18/28] usb: add USBEndpoint->{nr,pid} Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 19/28] usb: Set USBEndpoint in usb_packet_setup() Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 20/28] usb: maintain async packet list per endpoint Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 21/28] usb: pass USBEndpoint to usb_wakeup Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 22/28] usb: add USBBusOps->wakeup_endpoint Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 23/28] xhci: signal low- and fullspeed support Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 24/28] xhci: add trb type name lookup support Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 25/28] xhci: stop on errors Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 26/28] xhci: kill port arg from xhci_setup_packet Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 27/28] xhci: remote wakeup support Gerd Hoffmann
2012-02-10 11:43 ` [Qemu-devel] [PATCH 28/28] xhci: handle USB_RET_NAK Gerd Hoffmann
2012-02-16  0:32 ` [Qemu-devel] [PULL 00/28] usb patch queue Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1328874204-20920-8-git-send-email-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).