Il 01/05/2012 20:18, Anthony Liguori ha scritto:
> It should have never been a bus method.

If in the long term you want slots to be child properties in the bus,
the method _will_ actually belong to buses.

It is clear cut for print_dev, but not so much for the others.

Paolo

> 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 87ff1a5..eaa3e12 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -528,15 +528,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 9949192..38189f3 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;
>  }
>  
> @@ -1428,15 +1427,15 @@ 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;
>      char *path;
>  
> -    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) {
>          path = g_strdup_printf("%s/%d:%d:%d", id, d->channel, d->id, d->lun);
> @@ -1579,6 +1578,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[] = {


Reply via email to