Commit cf21e106cd9b34a12a533191932a8a08a1f5ebe4

Authored by Paul Brook
1 parent 9d07d757

Virtio-net qdev conversion

Signed-off-by: Paul Brook <paul@codesourcery.com>
hw/pci.c
@@ -25,7 +25,6 @@ @@ -25,7 +25,6 @@
25 #include "pci.h" 25 #include "pci.h"
26 #include "monitor.h" 26 #include "monitor.h"
27 #include "net.h" 27 #include "net.h"
28 -#include "virtio-net.h"  
29 #include "sysemu.h" 28 #include "sysemu.h"
30 29
31 //#define DEBUG_PCI 30 //#define DEBUG_PCI
hw/virtio-balloon.c
@@ -172,16 +172,20 @@ static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) @@ -172,16 +172,20 @@ static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id)
172 void *virtio_balloon_init(PCIBus *bus) 172 void *virtio_balloon_init(PCIBus *bus)
173 { 173 {
174 VirtIOBalloon *s; 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 PCI_VENDOR_ID_REDHAT_QUMRANET, 183 PCI_VENDOR_ID_REDHAT_QUMRANET,
178 PCI_DEVICE_ID_VIRTIO_BALLOON, 184 PCI_DEVICE_ID_VIRTIO_BALLOON,
179 PCI_VENDOR_ID_REDHAT_QUMRANET, 185 PCI_VENDOR_ID_REDHAT_QUMRANET,
180 VIRTIO_ID_BALLOON, 186 VIRTIO_ID_BALLOON,
181 PCI_CLASS_MEMORY_RAM, 0x00, 187 PCI_CLASS_MEMORY_RAM, 0x00,
182 - 8, sizeof(VirtIOBalloon));  
183 - if (s == NULL)  
184 - return NULL; 188 + 8);
185 189
186 s->vdev.get_config = virtio_balloon_get_config; 190 s->vdev.get_config = virtio_balloon_get_config;
187 s->vdev.set_config = virtio_balloon_set_config; 191 s->vdev.set_config = virtio_balloon_set_config;
hw/virtio-blk.c
@@ -353,16 +353,20 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs) @@ -353,16 +353,20 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs)
353 VirtIOBlock *s; 353 VirtIOBlock *s;
354 int cylinders, heads, secs; 354 int cylinders, heads, secs;
355 static int virtio_blk_id; 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 PCI_VENDOR_ID_REDHAT_QUMRANET, 364 PCI_VENDOR_ID_REDHAT_QUMRANET,
359 PCI_DEVICE_ID_VIRTIO_BLOCK, 365 PCI_DEVICE_ID_VIRTIO_BLOCK,
360 PCI_VENDOR_ID_REDHAT_QUMRANET, 366 PCI_VENDOR_ID_REDHAT_QUMRANET,
361 VIRTIO_ID_BLOCK, 367 VIRTIO_ID_BLOCK,
362 PCI_CLASS_STORAGE_OTHER, 0x00, 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 s->vdev.get_config = virtio_blk_update_config; 371 s->vdev.get_config = virtio_blk_update_config;
368 s->vdev.get_features = virtio_blk_get_features; 372 s->vdev.get_features = virtio_blk_get_features;
hw/virtio-console.c
@@ -126,14 +126,20 @@ static int virtio_console_load(QEMUFile *f, void *opaque, int version_id) @@ -126,14 +126,20 @@ static int virtio_console_load(QEMUFile *f, void *opaque, int version_id)
126 void *virtio_console_init(PCIBus *bus, CharDriverState *chr) 126 void *virtio_console_init(PCIBus *bus, CharDriverState *chr)
127 { 127 {
128 VirtIOConsole *s; 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 PCI_VENDOR_ID_REDHAT_QUMRANET, 137 PCI_VENDOR_ID_REDHAT_QUMRANET,
132 PCI_DEVICE_ID_VIRTIO_CONSOLE, 138 PCI_DEVICE_ID_VIRTIO_CONSOLE,
133 PCI_VENDOR_ID_REDHAT_QUMRANET, 139 PCI_VENDOR_ID_REDHAT_QUMRANET,
134 VIRTIO_ID_CONSOLE, 140 VIRTIO_ID_CONSOLE,
135 PCI_CLASS_DISPLAY_OTHER, 0x00, 141 PCI_CLASS_DISPLAY_OTHER, 0x00,
136 - 0, sizeof(VirtIOConsole)); 142 + 0);
137 if (s == NULL) 143 if (s == NULL)
138 return NULL; 144 return NULL;
139 145
hw/virtio-net.c
@@ -585,21 +585,18 @@ static void virtio_net_cleanup(VLANClientState *vc) @@ -585,21 +585,18 @@ static void virtio_net_cleanup(VLANClientState *vc)
585 virtio_cleanup(&n->vdev); 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 VirtIONet *n; 590 VirtIONet *n;
591 static int virtio_net_id; 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 PCI_VENDOR_ID_REDHAT_QUMRANET, 594 PCI_VENDOR_ID_REDHAT_QUMRANET,
595 PCI_DEVICE_ID_VIRTIO_NET, 595 PCI_DEVICE_ID_VIRTIO_NET,
596 PCI_VENDOR_ID_REDHAT_QUMRANET, 596 PCI_VENDOR_ID_REDHAT_QUMRANET,
597 VIRTIO_ID_NET, 597 VIRTIO_ID_NET,
598 PCI_CLASS_NETWORK_ETHERNET, 0x00, 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 n->vdev.get_config = virtio_net_get_config; 601 n->vdev.get_config = virtio_net_get_config;
605 n->vdev.set_config = virtio_net_set_config; 602 n->vdev.set_config = virtio_net_set_config;
@@ -610,9 +607,9 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) @@ -610,9 +607,9 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn)
610 n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx); 607 n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx);
611 n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx); 608 n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx);
612 n->ctrl_vq = virtio_add_queue(&n->vdev, 16, virtio_net_handle_ctrl); 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 n->status = VIRTIO_NET_S_LINK_UP; 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 virtio_net_receive, 613 virtio_net_receive,
617 virtio_net_can_receive, 614 virtio_net_can_receive,
618 virtio_net_cleanup, n); 615 virtio_net_cleanup, n);
@@ -631,5 +628,11 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) @@ -631,5 +628,11 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn)
631 628
632 register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION, 629 register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION,
633 virtio_net_save, virtio_net_load, n); 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)
hw/virtio-net.h
@@ -85,8 +85,6 @@ struct virtio_net_hdr_mrg_rxbuf @@ -85,8 +85,6 @@ struct virtio_net_hdr_mrg_rxbuf
85 uint16_t num_buffers; /* Number of merged rx buffers */ 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 * Control virtqueue data structures 89 * Control virtqueue data structures
92 * 90 *
hw/virtio.c
@@ -757,22 +757,16 @@ void virtio_cleanup(VirtIODevice *vdev) @@ -757,22 +757,16 @@ void virtio_cleanup(VirtIODevice *vdev)
757 qemu_free(vdev->vq); 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 uint16_t vendor, uint16_t device, 761 uint16_t vendor, uint16_t device,
762 uint16_t subvendor, uint16_t subdevice, 762 uint16_t subvendor, uint16_t subdevice,
763 uint16_t class_code, uint8_t pif, 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 VirtIODevice *vdev; 766 VirtIODevice *vdev;
767 - PCIDevice *pci_dev;  
768 uint8_t *config; 767 uint8_t *config;
769 uint32_t size; 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 vdev = to_virtio_device(pci_dev); 770 vdev = to_virtio_device(pci_dev);
777 771
778 vdev->status = 0; 772 vdev->status = 0;
hw/virtio.h
@@ -92,11 +92,11 @@ struct VirtIODevice @@ -92,11 +92,11 @@ struct VirtIODevice
92 VirtQueue *vq; 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 uint16_t vendor, uint16_t device, 96 uint16_t vendor, uint16_t device,
97 uint16_t subvendor, uint16_t subdevice, 97 uint16_t subvendor, uint16_t subdevice,
98 uint16_t class_code, uint8_t pif, 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 VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size, 101 VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
102 void (*handle_output)(VirtIODevice *, 102 void (*handle_output)(VirtIODevice *,