Revision 5607c388 hw/pci.c

b/hw/pci.c
254 254
    return pci_parse_devaddr(devaddr, domp, busp, slotp);
255 255
}
256 256

  
257
static PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
258
{
259
    int dom, bus;
260
    unsigned slot;
261

  
262
    if (!devaddr) {
263
        *devfnp = -1;
264
        return pci_find_bus(0);
265
    }
266

  
267
    if (pci_parse_devaddr(devaddr, &dom, &bus, &slot) < 0) {
268
        return NULL;
269
    }
270

  
271
    *devfnp = slot << 3;
272
    return pci_find_bus(bus);
273
}
274

  
257 275
/* -1 for devfn means auto assign */
258 276
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
259 277
                                         const char *name, int devfn,
......
802 820
    pci_for_each_device(0, pci_info_device);
803 821
}
804 822

  
823
static PCIDevice *pci_create(const char *name, const char *devaddr)
824
{
825
    PCIBus *bus;
826
    int devfn;
827
    DeviceState *dev;
828

  
829
    bus = pci_get_bus_devfn(&devfn, devaddr);
830
    if (!bus) {
831
        fprintf(stderr, "Invalid PCI device address %s for device %s\n",
832
                devaddr, name);
833
        exit(1);
834
    }
835

  
836
    dev = qdev_create(&bus->qbus, name);
837
    qdev_set_prop_int(dev, "devfn", devfn);
838
    return (PCIDevice *)dev;
839
}
840

  
805 841
static const char * const pci_nic_models[] = {
806 842
    "ne2k_pci",
807 843
    "i82551",
......
827 863
};
828 864

  
829 865
/* Initialize a PCI NIC.  */
830
PCIDevice *pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn,
831
                  const char *default_model)
866
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
867
                        const char *default_devaddr)
832 868
{
869
    const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
870
    PCIDevice *pci_dev;
833 871
    DeviceState *dev;
834 872
    int i;
835 873

  
......
837 875

  
838 876
    for (i = 0; pci_nic_models[i]; i++) {
839 877
        if (strcmp(nd->model, pci_nic_models[i]) == 0) {
840
            dev = qdev_create(&bus->qbus, pci_nic_names[i]);
841
            qdev_set_prop_int(dev, "devfn", devfn);
878
            pci_dev = pci_create(pci_nic_names[i], devaddr);
879
            dev = &pci_dev->qdev;
842 880
            qdev_set_netdev(dev, nd);
843 881
            qdev_init(dev);
844 882
            nd->private = dev;
845
            return (PCIDevice *)dev;
883
            return pci_dev;
846 884
        }
847 885
    }
848 886

  

Also available in: Unified diff