usb: keep track of physical port address.
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 <kraxel@redhat.com>
This commit is contained in:
parent
fa7935c1e1
commit
c7a2196a4f
26
hw/usb-bus.c
26
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);
|
||||
}
|
||||
}
|
||||
|
11
hw/usb-hub.c
11
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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) +
|
||||
|
2
hw/usb.h
2
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);
|
||||
|
Loading…
Reference in New Issue
Block a user