It should have never been a bus method. Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> --- hw/pci.c | 75 ++++++++++++++++++++++++++++----------------------------- hw/qdev.c | 11 ++------ hw/qdev.h | 2 +- hw/scsi-bus.c | 10 ++++---- hw/usb/bus.c | 41 +++++++++++++++---------------- 5 files changed, 66 insertions(+), 73 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c index bff303b..291181e 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -40,7 +40,6 @@ #endif static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent); -static char *pcibus_get_dev_path(DeviceState *dev); static char *pcibus_get_fw_dev_path(DeviceState *dev); static int pcibus_reset(BusState *qbus); @@ -49,7 +48,6 @@ static void pci_bus_class_init(ObjectClass *klass, void *data) BusClass *k = BUS_CLASS(klass); k->print_dev = pcibus_dev_print; - k->get_dev_path = pcibus_get_dev_path; k->get_fw_dev_path = pcibus_get_fw_dev_path; k->reset = pcibus_reset; } @@ -1899,7 +1897,42 @@ static char *pcibus_get_fw_dev_path(DeviceState *dev) return strdup(path); } -static char *pcibus_get_dev_path(DeviceState *dev) +static int pci_qdev_find_recursive(PCIBus *bus, + const char *id, PCIDevice **pdev) +{ + DeviceState *qdev = qdev_find_recursive(&bus->qbus, id); + if (!qdev) { + return -ENODEV; + } + + /* roughly check if given qdev is pci device */ + if (object_dynamic_cast(OBJECT(qdev), TYPE_PCI_DEVICE)) { + *pdev = PCI_DEVICE(qdev); + return 0; + } + return -EINVAL; +} + +int pci_qdev_find_device(const char *id, PCIDevice **pdev) +{ + struct PCIHostBus *host; + int rc = -ENODEV; + + QLIST_FOREACH(host, &host_buses, next) { + int tmp = pci_qdev_find_recursive(host->bus, id, pdev); + if (!tmp) { + rc = 0; + break; + } + if (tmp != -ENODEV) { + rc = tmp; + } + } + + return rc; +} + +static char *pci_qdev_get_dev_path(DeviceState *dev) { PCIDevice *d = container_of(dev, PCIDevice, qdev); PCIDevice *t; @@ -1948,41 +1981,6 @@ static char *pcibus_get_dev_path(DeviceState *dev) return path; } -static int pci_qdev_find_recursive(PCIBus *bus, - const char *id, PCIDevice **pdev) -{ - DeviceState *qdev = qdev_find_recursive(&bus->qbus, id); - if (!qdev) { - return -ENODEV; - } - - /* roughly check if given qdev is pci device */ - if (object_dynamic_cast(OBJECT(qdev), TYPE_PCI_DEVICE)) { - *pdev = PCI_DEVICE(qdev); - return 0; - } - return -EINVAL; -} - -int pci_qdev_find_device(const char *id, PCIDevice **pdev) -{ - struct PCIHostBus *host; - int rc = -ENODEV; - - QLIST_FOREACH(host, &host_buses, next) { - int tmp = pci_qdev_find_recursive(host->bus, id, pdev); - if (!tmp) { - rc = 0; - break; - } - if (tmp != -ENODEV) { - rc = tmp; - } - } - - return rc; -} - MemoryRegion *pci_address_space(PCIDevice *dev) { return dev->bus->address_space_mem; @@ -2000,6 +1998,7 @@ static void pci_device_class_init(ObjectClass *klass, void *data) k->unplug = pci_unplug_device; k->exit = pci_unregister_device; k->bus_type = TYPE_PCI_BUS; + k->get_dev_path = pci_qdev_get_dev_path; } static Property pci_bus_properties[] = { diff --git a/hw/qdev.c b/hw/qdev.c index b5eef22..f1ee278 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -526,15 +526,10 @@ char* qdev_get_fw_dev_path(DeviceState *dev) char *qdev_get_dev_path(DeviceState *dev) { - BusClass *bc; - - if (!dev->parent_bus) { - return NULL; - } + DeviceClass *dc = DEVICE_GET_CLASS(dev); - bc = BUS_GET_CLASS(dev->parent_bus); - if (bc->get_dev_path) { - return bc->get_dev_path(dev); + if (dc->get_dev_path) { + return dc->get_dev_path(dev); } return NULL; diff --git a/hw/qdev.h b/hw/qdev.h index 8ac703e..30bfbef 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -47,6 +47,7 @@ typedef struct DeviceClass { /* callbacks */ void (*reset)(DeviceState *dev); + char *(*get_dev_path)(DeviceState *dev); /* device state */ const VMStateDescription *vmsd; @@ -95,7 +96,6 @@ struct BusClass { /* FIXME first arg should be BusState */ void (*print_dev)(Monitor *mon, DeviceState *dev, int indent); - char *(*get_dev_path)(DeviceState *dev); char *(*get_fw_dev_path)(DeviceState *dev); int (*reset)(BusState *bus); }; diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 806a1b8..51f49cd 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -16,7 +16,6 @@ static void scsi_bus_class_init(ObjectClass *klass, void *data) { BusClass *k = BUS_CLASS(klass); - k->get_dev_path = scsibus_get_dev_path; k->get_fw_dev_path = scsibus_get_fw_dev_path; } @@ -1427,14 +1426,14 @@ void scsi_device_purge_requests(SCSIDevice *sdev, SCSISense sense) sdev->unit_attention = sense; } -static char *scsibus_get_dev_path(DeviceState *dev) +static char *scsi_qdev_get_dev_path(DeviceState *dev) { - SCSIDevice *d = DO_UPCAST(SCSIDevice, qdev, dev); + SCSIDevice *d = SCSI_DEVICE(dev); DeviceState *hba = dev->parent_bus->parent; char *id = NULL; - if (hba && hba->parent_bus && hba->parent_bus->info->get_dev_path) { - id = hba->parent_bus->info->get_dev_path(hba); + if (hba) { + id = qdev_get_dev_path(hba); } if (id) { return g_strdup_printf("%s/%d:%d:%d", id, d->channel, d->id, d->lun); @@ -1575,6 +1574,7 @@ static void scsi_device_class_init(ObjectClass *klass, void *data) k->init = scsi_qdev_init; k->unplug = qdev_simple_unplug_cb; k->exit = scsi_qdev_exit; + k->get_dev_path = scsi_qdev_get_dev_path; } static Property scsi_bus_properties[] = { diff --git a/hw/usb/bus.c b/hw/usb/bus.c index e2a87ed..9b57d1c 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -7,7 +7,6 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent); -static char *usb_get_dev_path(DeviceState *dev); static char *usb_get_fw_dev_path(DeviceState *qdev); static int usb_qdev_exit(DeviceState *qdev); @@ -18,7 +17,6 @@ static void usb_bus_class_init(ObjectClass *klass, void *data) BusClass *k = BUS_CLASS(klass); k->print_dev = usb_bus_dev_print; - k->get_dev_path = usb_get_dev_path; k->get_fw_dev_path = usb_get_fw_dev_path; } @@ -464,25 +462,6 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent) dev->attached ? ", attached" : ""); } -static char *usb_get_dev_path(DeviceState *qdev) -{ - USBDevice *dev = USB_DEVICE(qdev); - DeviceState *hcd = qdev->parent_bus->parent; - char *id = NULL; - - if ((dev->flags & (1 << USB_DEV_FLAG_FULL_PATH)) && - hcd && hcd->parent_bus && hcd->parent_bus->info->get_dev_path) { - id = hcd->parent_bus->info->get_dev_path(hcd); - } - if (id) { - char *ret = g_strdup_printf("%s/%s", id, dev->port->path); - g_free(id); - return ret; - } else { - return g_strdup(dev->port->path); - } -} - static char *usb_get_fw_dev_path(DeviceState *qdev) { USBDevice *dev = USB_DEVICE(qdev); @@ -578,13 +557,33 @@ USBDevice *usbdevice_create(const char *cmdline) return f->usbdevice_init(bus, params); } +static char *usb_qdev_get_dev_path(DeviceState *qdev) +{ + USBDevice *dev = USB_DEVICE(qdev); + DeviceState *hcd = qdev->parent_bus->parent; + char *id = NULL; + + if ((dev->flags & (1 << USB_DEV_FLAG_FULL_PATH))) { + id = qdev_get_dev_path(hcd); + } + if (id) { + char *ret = g_strdup_printf("%s/%s", id, dev->port->path); + g_free(id); + return ret; + } else { + return g_strdup(dev->port->path); + } +} + static void usb_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k = DEVICE_CLASS(klass); + k->bus_type = TYPE_USB_BUS; k->init = usb_qdev_init; k->unplug = qdev_simple_unplug_cb; k->exit = usb_qdev_exit; + k->get_dev_path = usb_qdev_get_dev_path; } static Property usb_bus_properties[] = { -- 1.7.5.4