From patchwork Wed Jan 12 11:20:11 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 78554 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 40DD8B70E2 for ; Wed, 12 Jan 2011 23:16:24 +1100 (EST) Received: from localhost ([127.0.0.1]:35856 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pczci-0000YB-Ug for incoming@patchwork.ozlabs.org; Wed, 12 Jan 2011 07:16:20 -0500 Received: from [140.186.70.92] (port=56227 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PcylC-0006HA-JS for qemu-devel@nongnu.org; Wed, 12 Jan 2011 06:21:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pcyl7-0001dC-Kz for qemu-devel@nongnu.org; Wed, 12 Jan 2011 06:20:59 -0500 Received: from mx1.redhat.com ([209.132.183.28]:2037) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pcyl7-0001ct-9X for qemu-devel@nongnu.org; Wed, 12 Jan 2011 06:20:57 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id p0CBKu9P024946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 12 Jan 2011 06:20:56 -0500 Received: from rincewind.home.kraxel.org (vpn2-8-125.ams2.redhat.com [10.36.8.125]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p0CBKjJV029934; Wed, 12 Jan 2011 06:20:54 -0500 Received: by rincewind.home.kraxel.org (Postfix, from userid 500) id 604CF41625; Wed, 12 Jan 2011 12:20:16 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 12 Jan 2011 12:20:11 +0100 Message-Id: <1294831214-4499-30-git-send-email-kraxel@redhat.com> In-Reply-To: <1294831214-4499-1-git-send-email-kraxel@redhat.com> References: <1294831214-4499-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH v4 29/32] usb: keep track of physical port address. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Add a path string to USBPort. Add usb_port_location() function to set the physical location of the usb port. Update all drivers implementing usb ports to call it. Update the monitor commands to print it. Wind it up in qdev. Signed-off-by: Gerd Hoffmann --- hw/usb-bus.c | 26 +++++++++++++++++++++++--- hw/usb-hub.c | 11 +++++++++++ hw/usb-musb.c | 1 + hw/usb-ohci.c | 1 + hw/usb-uhci.c | 1 + hw/usb.h | 2 ++ 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/hw/usb-bus.c b/hw/usb-bus.c index e94b88d..0cb03c9 100644 --- a/hw/usb-bus.c +++ b/hw/usb-bus.c @@ -5,12 +5,15 @@ #include "monitor.h" static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent); + +static char *usb_get_dev_path(DeviceState *dev); static char *usbbus_get_fw_dev_path(DeviceState *dev); static struct BusInfo usb_bus_info = { .name = "USB", .size = sizeof(USBBus), .print_dev = usb_bus_dev_print, + .get_dev_path = usb_get_dev_path, .get_fw_dev_path = usbbus_get_fw_dev_path, }; static int next_usb_bus = 0; @@ -126,6 +129,16 @@ void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index, bus->nfree++; } +void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr) +{ + if (upstream) { + snprintf(downstream->path, sizeof(downstream->path), "%s.%d", + upstream->path, portnr); + } else { + snprintf(downstream->path, sizeof(downstream->path), "%d", portnr); + } +} + void usb_unregister_port(USBBus *bus, USBPort *port) { if (port->dev) @@ -235,12 +248,19 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent) USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev); USBBus *bus = usb_bus_from_device(dev); - monitor_printf(mon, "%*saddr %d.%d, speed %s, name %s%s\n", + monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n", indent, "", bus->busnr, dev->addr, + dev->port ? dev->port->path : "-", usb_speed(dev->speed), dev->product_desc, dev->attached ? ", attached" : ""); } +static char *usb_get_dev_path(DeviceState *qdev) +{ + USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev); + return qemu_strdup(dev->port->path); +} + void usb_info(Monitor *mon) { USBBus *bus; @@ -257,8 +277,8 @@ void usb_info(Monitor *mon) dev = port->dev; if (!dev) continue; - monitor_printf(mon, " Device %d.%d, Speed %s Mb/s, Product %s\n", - bus->busnr, dev->addr, usb_speed(dev->speed), + monitor_printf(mon, " Device %d.%d, Port %s, Speed %s Mb/s, Product %s\n", + bus->busnr, dev->addr, port->path, usb_speed(dev->speed), dev->product_desc); } } diff --git a/hw/usb-hub.c b/hw/usb-hub.c index ba712d6..387c40c 100644 --- a/hw/usb-hub.c +++ b/hw/usb-hub.c @@ -256,6 +256,16 @@ static void usb_hub_wakeup(USBDevice *dev) } } +static void usb_hub_handle_attach(USBDevice *dev) +{ + USBHubState *s = DO_UPCAST(USBHubState, dev, dev); + int i; + + for (i = 0; i < NUM_PORTS; i++) { + usb_port_location(&s->ports[i].port, dev->port, i+1); + } +} + static void usb_hub_handle_reset(USBDevice *dev) { /* XXX: do it */ @@ -542,6 +552,7 @@ static struct USBDeviceInfo hub_info = { .usb_desc = &desc_hub, .init = usb_hub_initfn, .handle_packet = usb_hub_handle_packet, + .handle_attach = usb_hub_handle_attach, .handle_reset = usb_hub_handle_reset, .handle_control = usb_hub_handle_control, .handle_data = usb_hub_handle_data, diff --git a/hw/usb-musb.c b/hw/usb-musb.c index 87eb9ca..4b5f35b 100644 --- a/hw/usb-musb.c +++ b/hw/usb-musb.c @@ -351,6 +351,7 @@ struct MUSBState { usb_bus_new(&s->bus, NULL /* FIXME */); usb_register_port(&s->bus, &s->port, s, 0, NULL, &musb_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + usb_port_location(&s->port, NULL, 1); return s; } diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c index 0d42716..6344f81 100644 --- a/hw/usb-ohci.c +++ b/hw/usb-ohci.c @@ -1701,6 +1701,7 @@ static void usb_ohci_init(OHCIState *ohci, DeviceState *dev, for (i = 0; i < num_ports; i++) { usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, NULL, &ohci_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + usb_port_location(&ohci->rhport[i].port, NULL, i+1); } ohci->async_td = 0; diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c index 253561f..6db1960 100644 --- a/hw/usb-uhci.c +++ b/hw/usb-uhci.c @@ -1131,6 +1131,7 @@ static int usb_uhci_common_initfn(UHCIState *s) for(i = 0; i < NB_PORTS; i++) { usb_register_port(&s->bus, &s->ports[i].port, s, i, NULL, &uhci_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + usb_port_location(&s->ports[i].port, NULL, i+1); } s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s); s->expire_time = qemu_get_clock(vm_clock) + diff --git a/hw/usb.h b/hw/usb.h index 99139e2..8fdda29 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -240,6 +240,7 @@ typedef struct USBPortOps { struct USBPort { USBDevice *dev; int speedmask; + char path[16]; USBPortOps *ops; void *opaque; USBDevice *pdev; @@ -354,6 +355,7 @@ USBDevice *usb_create_simple(USBBus *bus, const char *name); USBDevice *usbdevice_create(const char *cmdline); void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index, USBDevice *pdev, USBPortOps *ops, int speedmask); +void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr); void usb_unregister_port(USBBus *bus, USBPort *port); int usb_device_attach(USBDevice *dev); int usb_device_detach(USBDevice *dev);