Revision cf21e106

b/hw/pci.c
25 25
#include "pci.h"
26 26
#include "monitor.h"
27 27
#include "net.h"
28
#include "virtio-net.h"
29 28
#include "sysemu.h"
30 29

  
31 30
//#define DEBUG_PCI
b/hw/virtio-balloon.c
172 172
void *virtio_balloon_init(PCIBus *bus)
173 173
{
174 174
    VirtIOBalloon *s;
175
    PCIDevice *d;
175 176

  
176
    s = (VirtIOBalloon *)virtio_init_pci(bus, "virtio-balloon",
177
    d = pci_register_device(bus, "virtio-balloon", sizeof(VirtIOBalloon),
178
                            -1, NULL, NULL);
179
    if (!d)
180
        return NULL;
181

  
182
    s = (VirtIOBalloon *)virtio_init_pci(d, "virtio-balloon",
177 183
                                         PCI_VENDOR_ID_REDHAT_QUMRANET,
178 184
                                         PCI_DEVICE_ID_VIRTIO_BALLOON,
179 185
                                         PCI_VENDOR_ID_REDHAT_QUMRANET,
180 186
                                         VIRTIO_ID_BALLOON,
181 187
                                         PCI_CLASS_MEMORY_RAM, 0x00,
182
                                         8, sizeof(VirtIOBalloon));
183
    if (s == NULL)
184
        return NULL;
188
                                         8);
185 189

  
186 190
    s->vdev.get_config = virtio_balloon_get_config;
187 191
    s->vdev.set_config = virtio_balloon_set_config;
b/hw/virtio-blk.c
353 353
    VirtIOBlock *s;
354 354
    int cylinders, heads, secs;
355 355
    static int virtio_blk_id;
356
    PCIDevice *d;
356 357

  
357
    s = (VirtIOBlock *)virtio_init_pci(bus, "virtio-blk",
358
    d = pci_register_device(bus, "virtio-blk", sizeof(VirtIOBlock),
359
                            -1, NULL, NULL);
360
    if (!d)
361
        return NULL;
362

  
363
    s = (VirtIOBlock *)virtio_init_pci(d, "virtio-blk",
358 364
                                       PCI_VENDOR_ID_REDHAT_QUMRANET,
359 365
                                       PCI_DEVICE_ID_VIRTIO_BLOCK,
360 366
                                       PCI_VENDOR_ID_REDHAT_QUMRANET,
361 367
                                       VIRTIO_ID_BLOCK,
362 368
                                       PCI_CLASS_STORAGE_OTHER, 0x00,
363
                                       sizeof(struct virtio_blk_config), sizeof(VirtIOBlock));
364
    if (!s)
365
        return NULL;
369
                                       sizeof(struct virtio_blk_config));
366 370

  
367 371
    s->vdev.get_config = virtio_blk_update_config;
368 372
    s->vdev.get_features = virtio_blk_get_features;
b/hw/virtio-console.c
126 126
void *virtio_console_init(PCIBus *bus, CharDriverState *chr)
127 127
{
128 128
    VirtIOConsole *s;
129
    PCIDevice *d;
129 130

  
130
    s = (VirtIOConsole *)virtio_init_pci(bus, "virtio-console",
131
    d = pci_register_device(bus, "virtio-console", sizeof(VirtIOConsole),
132
                            -1, NULL, NULL);
133
    if (!d)
134
        return NULL;
135

  
136
    s = (VirtIOConsole *)virtio_init_pci(d, "virtio-console",
131 137
                                         PCI_VENDOR_ID_REDHAT_QUMRANET,
132 138
                                         PCI_DEVICE_ID_VIRTIO_CONSOLE,
133 139
                                         PCI_VENDOR_ID_REDHAT_QUMRANET,
134 140
                                         VIRTIO_ID_CONSOLE,
135 141
                                         PCI_CLASS_DISPLAY_OTHER, 0x00,
136
                                         0, sizeof(VirtIOConsole));
142
                                         0);
137 143
    if (s == NULL)
138 144
        return NULL;
139 145

  
b/hw/virtio-net.c
585 585
    virtio_cleanup(&n->vdev);
586 586
}
587 587

  
588
PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn)
588
static void virtio_net_init(PCIDevice *pci_dev)
589 589
{
590 590
    VirtIONet *n;
591 591
    static int virtio_net_id;
592 592

  
593
    n = (VirtIONet *)virtio_init_pci(bus, "virtio-net",
593
    n = (VirtIONet *)virtio_init_pci(pci_dev, "virtio-net",
594 594
                                     PCI_VENDOR_ID_REDHAT_QUMRANET,
595 595
                                     PCI_DEVICE_ID_VIRTIO_NET,
596 596
                                     PCI_VENDOR_ID_REDHAT_QUMRANET,
597 597
                                     VIRTIO_ID_NET,
598 598
                                     PCI_CLASS_NETWORK_ETHERNET, 0x00,
599
                                     sizeof(struct virtio_net_config),
600
                                     sizeof(VirtIONet));
601
    if (!n)
602
        return NULL;
599
                                     sizeof(struct virtio_net_config));
603 600

  
604 601
    n->vdev.get_config = virtio_net_get_config;
605 602
    n->vdev.set_config = virtio_net_set_config;
......
610 607
    n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx);
611 608
    n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx);
612 609
    n->ctrl_vq = virtio_add_queue(&n->vdev, 16, virtio_net_handle_ctrl);
613
    memcpy(n->mac, nd->macaddr, ETH_ALEN);
610
    qdev_get_macaddr(&pci_dev->qdev, n->mac);
614 611
    n->status = VIRTIO_NET_S_LINK_UP;
615
    n->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
612
    n->vc = qdev_get_vlan_client(&pci_dev->qdev,
616 613
                                 virtio_net_receive,
617 614
                                 virtio_net_can_receive,
618 615
                                 virtio_net_cleanup, n);
......
631 628

  
632 629
    register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION,
633 630
                    virtio_net_save, virtio_net_load, n);
634
    return (PCIDevice *)n;
635 631
}
632

  
633
static void virtio_net_register_devices(void)
634
{
635
    pci_qdev_register("virtio_net", sizeof(VirtIONet), virtio_net_init);
636
}
637

  
638
device_init(virtio_net_register_devices)
b/hw/virtio-net.h
85 85
    uint16_t num_buffers;   /* Number of merged rx buffers */
86 86
};
87 87

  
88
PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn);
89

  
90 88
/*
91 89
 * Control virtqueue data structures
92 90
 *
b/hw/virtio.c
757 757
    qemu_free(vdev->vq);
758 758
}
759 759

  
760
VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name,
760
VirtIODevice *virtio_init_pci(PCIDevice *pci_dev, const char *name,
761 761
                              uint16_t vendor, uint16_t device,
762 762
                              uint16_t subvendor, uint16_t subdevice,
763 763
                              uint16_t class_code, uint8_t pif,
764
                              size_t config_size, size_t struct_size)
764
                              size_t config_size)
765 765
{
766 766
    VirtIODevice *vdev;
767
    PCIDevice *pci_dev;
768 767
    uint8_t *config;
769 768
    uint32_t size;
770 769

  
771
    pci_dev = pci_register_device(bus, name, struct_size,
772
                                  -1, NULL, NULL);
773
    if (!pci_dev)
774
        return NULL;
775

  
776 770
    vdev = to_virtio_device(pci_dev);
777 771

  
778 772
    vdev->status = 0;
b/hw/virtio.h
92 92
    VirtQueue *vq;
93 93
};
94 94

  
95
VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name,
95
VirtIODevice *virtio_init_pci(PCIDevice *pci_dev, const char *name,
96 96
                              uint16_t vendor, uint16_t device,
97 97
                              uint16_t subvendor, uint16_t subdevice,
98 98
                              uint16_t class_code, uint8_t pif,
99
                              size_t config_size, size_t struct_size);
99
                              size_t config_size);
100 100

  
101 101
VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
102 102
                            void (*handle_output)(VirtIODevice *,

Also available in: Unified diff