Commit 9d07d7579bcaf01e05c511c63d091ed2ac310091

Authored by Paul Brook
1 parent 9be5dafe

PCI network qdev conversion

Signed-off-by: Paul Brook <paul@codesourcery.com>
hw/e1000.c
... ... @@ -1051,20 +1051,14 @@ pci_e1000_uninit(PCIDevice *dev)
1051 1051 return 0;
1052 1052 }
1053 1053  
1054   -PCIDevice *
1055   -pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn)
  1054 +static void pci_e1000_init(PCIDevice *pci_dev)
1056 1055 {
1057   - E1000State *d;
  1056 + E1000State *d = (E1000State *)pci_dev;
1058 1057 uint8_t *pci_conf;
1059 1058 uint16_t checksum = 0;
1060 1059 static const char info_str[] = "e1000";
1061 1060 int i;
1062   -
1063   - d = (E1000State *)pci_register_device(bus, "e1000",
1064   - sizeof(E1000State), devfn, NULL, NULL);
1065   -
1066   - if (!d)
1067   - return NULL;
  1061 + uint8_t macaddr[6];
1068 1062  
1069 1063 pci_conf = d->dev.config;
1070 1064  
... ... @@ -1089,8 +1083,9 @@ pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn)
1089 1083  
1090 1084 memmove(d->eeprom_data, e1000_eeprom_template,
1091 1085 sizeof e1000_eeprom_template);
  1086 + qdev_get_macaddr(&d->dev.qdev, macaddr);
1092 1087 for (i = 0; i < 3; i++)
1093   - d->eeprom_data[i] = (nd->macaddr[2*i+1]<<8) | nd->macaddr[2*i];
  1088 + d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
1094 1089 for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1095 1090 checksum += d->eeprom_data[i];
1096 1091 checksum = (uint16_t) EEPROM_SUM - checksum;
... ... @@ -1103,15 +1098,20 @@ pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn)
1103 1098 d->rxbuf_min_shift = 1;
1104 1099 memset(&d->tx, 0, sizeof d->tx);
1105 1100  
1106   - d->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
  1101 + d->vc = qdev_get_vlan_client(&d->dev.qdev,
1107 1102 e1000_receive, e1000_can_receive,
1108 1103 e1000_cleanup, d);
1109 1104 d->vc->link_status_changed = e1000_set_link_status;
1110 1105  
1111   - qemu_format_nic_info_str(d->vc, nd->macaddr);
  1106 + qemu_format_nic_info_str(d->vc, macaddr);
1112 1107  
1113 1108 register_savevm(info_str, -1, 2, nic_save, nic_load, d);
1114 1109 d->dev.unregister = pci_e1000_uninit;
  1110 +}
1115 1111  
1116   - return (PCIDevice *)d;
  1112 +static void e1000_register_devices(void)
  1113 +{
  1114 + pci_qdev_register("e1000", sizeof(E1000State), pci_e1000_init);
1117 1115 }
  1116 +
  1117 +device_init(e1000_register_devices)
... ...
hw/eepro100.c
... ... @@ -1728,19 +1728,13 @@ static int pci_nic_uninit(PCIDevice *dev)
1728 1728 return 0;
1729 1729 }
1730 1730  
1731   -static PCIDevice *nic_init(PCIBus * bus, NICInfo * nd, uint32_t device)
  1731 +static void nic_init(PCIDevice *pci_dev, uint32_t device)
1732 1732 {
1733   - PCIEEPRO100State *d;
  1733 + PCIEEPRO100State *d = (PCIEEPRO100State *)pci_dev;
1734 1734 EEPRO100State *s;
1735 1735  
1736 1736 logout("\n");
1737 1737  
1738   - d = (PCIEEPRO100State *) pci_register_device(bus, nd->model,
1739   - sizeof(PCIEEPRO100State), -1,
1740   - NULL, NULL);
1741   - if (!d)
1742   - return NULL;
1743   -
1744 1738 d->dev.unregister = pci_nic_uninit;
1745 1739  
1746 1740 s = &d->eepro100;
... ... @@ -1765,13 +1759,13 @@ static PCIDevice *nic_init(PCIBus * bus, NICInfo * nd, uint32_t device)
1765 1759 pci_register_io_region(&d->dev, 2, PCI_FLASH_SIZE, PCI_ADDRESS_SPACE_MEM,
1766 1760 pci_mmio_map);
1767 1761  
1768   - memcpy(s->macaddr, nd->macaddr, 6);
  1762 + qdev_get_macaddr(&d->dev.qdev, s->macaddr);
1769 1763 logout("macaddr: %s\n", nic_dump(&s->macaddr[0], 6));
1770 1764 assert(s->region[1] == 0);
1771 1765  
1772 1766 nic_reset(s);
1773 1767  
1774   - s->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
  1768 + s->vc = qdev_get_vlan_client(&d->dev.qdev,
1775 1769 nic_receive, nic_can_receive,
1776 1770 nic_cleanup, s);
1777 1771  
... ... @@ -1780,22 +1774,31 @@ static PCIDevice *nic_init(PCIBus * bus, NICInfo * nd, uint32_t device)
1780 1774 qemu_register_reset(nic_reset, s);
1781 1775  
1782 1776 register_savevm(s->vc->model, -1, 3, nic_save, nic_load, s);
1783   - return (PCIDevice *)d;
1784 1777 }
1785 1778  
1786   -PCIDevice *pci_i82551_init(PCIBus * bus, NICInfo * nd, int devfn)
  1779 +static void pci_i82551_init(PCIDevice *dev)
  1780 +{
  1781 + nic_init(dev, i82551);
  1782 +}
  1783 +
  1784 +static void pci_i82557b_init(PCIDevice *dev)
1787 1785 {
1788   - return nic_init(bus, nd, i82551);
  1786 + nic_init(dev, i82557B);
1789 1787 }
1790 1788  
1791   -PCIDevice *pci_i82557b_init(PCIBus * bus, NICInfo * nd, int devfn)
  1789 +static void pci_i82559er_init(PCIDevice *dev)
1792 1790 {
1793   - return nic_init(bus, nd, i82557B);
  1791 + nic_init(dev, i82559ER);
1794 1792 }
1795 1793  
1796   -PCIDevice *pci_i82559er_init(PCIBus * bus, NICInfo * nd, int devfn)
  1794 +static void eepro100_register_devices(void)
1797 1795 {
1798   - return nic_init(bus, nd, i82559ER);
  1796 + pci_qdev_register("i82551", sizeof(PCIEEPRO100State),
  1797 + pci_i82551_init);
  1798 + pci_qdev_register("i82557b", sizeof(PCIEEPRO100State),
  1799 + pci_i82557b_init);
  1800 + pci_qdev_register("i82559er", sizeof(PCIEEPRO100State),
  1801 + pci_i82559er_init);
1799 1802 }
1800 1803  
1801   -/* eof */
  1804 +device_init(eepro100_register_devices)
... ...
hw/ne2000.c
... ... @@ -800,19 +800,12 @@ static void ne2000_cleanup(VLANClientState *vc)
800 800 unregister_savevm("ne2000", s);
801 801 }
802 802  
803   -PCIDevice *pci_ne2000_init(PCIBus *bus, NICInfo *nd, int devfn)
  803 +static void pci_ne2000_init(PCIDevice *pci_dev)
804 804 {
805   - PCINE2000State *d;
  805 + PCINE2000State *d = (PCINE2000State *)pci_dev;
806 806 NE2000State *s;
807 807 uint8_t *pci_conf;
808 808  
809   - d = (PCINE2000State *)pci_register_device(bus,
810   - "NE2000", sizeof(PCINE2000State),
811   - devfn,
812   - NULL, NULL);
813   - if (!d)
814   - return NULL;
815   -
816 809 pci_conf = d->dev.config;
817 810 pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_REALTEK);
818 811 pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_REALTEK_8029);
... ... @@ -825,15 +818,20 @@ PCIDevice *pci_ne2000_init(PCIBus *bus, NICInfo *nd, int devfn)
825 818 s = &d->ne2000;
826 819 s->irq = d->dev.irq[0];
827 820 s->pci_dev = (PCIDevice *)d;
828   - memcpy(s->macaddr, nd->macaddr, 6);
  821 + qdev_get_macaddr(&d->dev.qdev, s->macaddr);
829 822 ne2000_reset(s);
830   - s->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
  823 + s->vc = qdev_get_vlan_client(&d->dev.qdev,
831 824 ne2000_receive, ne2000_can_receive,
832 825 ne2000_cleanup, s);
833 826  
834 827 qemu_format_nic_info_str(s->vc, s->macaddr);
835 828  
836 829 register_savevm("ne2000", -1, 3, ne2000_save, ne2000_load, s);
  830 +}
837 831  
838   - return (PCIDevice *)d;
  832 +static void ne2000_register_devices(void)
  833 +{
  834 + pci_qdev_register("ne2k_pci", sizeof(PCINE2000State), pci_ne2000_init);
839 835 }
  836 +
  837 +device_init(ne2000_register_devices)
... ...
hw/pci.c
... ... @@ -799,17 +799,15 @@ static const char * const pci_nic_models[] = {
799 799 NULL
800 800 };
801 801  
802   -typedef PCIDevice *(*PCINICInitFn)(PCIBus *, NICInfo *, int);
803   -
804   -static PCINICInitFn pci_nic_init_fns[] = {
805   - pci_ne2000_init,
806   - pci_i82551_init,
807   - pci_i82557b_init,
808   - pci_i82559er_init,
809   - pci_rtl8139_init,
810   - pci_e1000_init,
811   - pci_pcnet_init,
812   - virtio_net_init,
  802 +static const char * const pci_nic_names[] = {
  803 + "ne2k_pci",
  804 + "i82551",
  805 + "i82557b",
  806 + "i82559er",
  807 + "rtl8139",
  808 + "e1000",
  809 + "pcnet",
  810 + "virtio_net",
813 811 NULL
814 812 };
815 813  
... ... @@ -817,18 +815,21 @@ static PCINICInitFn pci_nic_init_fns[] = {
817 815 PCIDevice *pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn,
818 816 const char *default_model)
819 817 {
820   - PCIDevice *pci_dev;
  818 + DeviceState *dev;
821 819 int i;
822 820  
823 821 qemu_check_nic_model_list(nd, pci_nic_models, default_model);
824 822  
825   - for (i = 0; pci_nic_models[i]; i++)
  823 + for (i = 0; pci_nic_models[i]; i++) {
826 824 if (strcmp(nd->model, pci_nic_models[i]) == 0) {
827   - pci_dev = pci_nic_init_fns[i](bus, nd, devfn);
828   - if (pci_dev)
829   - nd->private = pci_dev;
830   - return pci_dev;
  825 + dev = qdev_create(bus, pci_nic_names[i]);
  826 + qdev_set_prop_int(dev, "devfn", devfn);
  827 + qdev_set_netdev(dev, nd);
  828 + qdev_init(dev);
  829 + nd->private = dev;
  830 + return (PCIDevice *)dev;
831 831 }
  832 + }
832 833  
833 834 return NULL;
834 835 }
... ...
hw/pci.h
... ... @@ -239,26 +239,6 @@ void usb_uhci_piix4_init(PCIBus *bus, int devfn);
239 239 /* usb-ohci.c */
240 240 void usb_ohci_init_pci(struct PCIBus *bus, int num_ports, int devfn);
241 241  
242   -/* eepro100.c */
243   -
244   -PCIDevice *pci_i82551_init(PCIBus *bus, NICInfo *nd, int devfn);
245   -PCIDevice *pci_i82557b_init(PCIBus *bus, NICInfo *nd, int devfn);
246   -PCIDevice *pci_i82559er_init(PCIBus *bus, NICInfo *nd, int devfn);
247   -
248   -/* ne2000.c */
249   -
250   -PCIDevice *pci_ne2000_init(PCIBus *bus, NICInfo *nd, int devfn);
251   -
252   -/* rtl8139.c */
253   -
254   -PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn);
255   -
256   -/* e1000.c */
257   -PCIDevice *pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn);
258   -
259   -/* pcnet.c */
260   -PCIDevice *pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn);
261   -
262 242 /* prep_pci.c */
263 243 PCIBus *pci_prep_init(qemu_irq *pic);
264 244  
... ...
hw/pcnet.c
... ... @@ -35,7 +35,7 @@
35 35 * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR92C990.txt
36 36 */
37 37  
38   -#include "hw.h"
  38 +#include "sysbus.h"
39 39 #include "pci.h"
40 40 #include "net.h"
41 41 #include "qemu-timer.h"
... ... @@ -60,22 +60,20 @@
60 60 typedef struct PCNetState_st PCNetState;
61 61  
62 62 struct PCNetState_st {
63   - PCIDevice dev;
64 63 PCIDevice *pci_dev;
65 64 VLANClientState *vc;
66   - NICInfo *nd;
  65 + uint8_t macaddr[6];
67 66 QEMUTimer *poll_timer;
68   - int mmio_index, rap, isr, lnkst;
  67 + int rap, isr, lnkst;
69 68 uint32_t rdra, tdra;
70 69 uint8_t prom[16];
71 70 uint16_t csr[128];
72 71 uint16_t bcr[32];
73 72 uint64_t timer;
74   - int xmit_pos, recv_pos;
  73 + int mmio_index, xmit_pos, recv_pos;
75 74 uint8_t buffer[4096];
76 75 int tx_busy;
77 76 qemu_irq irq;
78   - qemu_irq *reset_irq;
79 77 void (*phys_mem_read)(void *dma_opaque, target_phys_addr_t addr,
80 78 uint8_t *buf, int len, int do_bswap);
81 79 void (*phys_mem_write)(void *dma_opaque, target_phys_addr_t addr,
... ... @@ -84,6 +82,16 @@ struct PCNetState_st {
84 82 int looptest;
85 83 };
86 84  
  85 +typedef struct {
  86 + PCIDevice pci_dev;
  87 + PCNetState state;
  88 +} PCIPCNetState;
  89 +
  90 +typedef struct {
  91 + SysBusDevice busdev;
  92 + PCNetState state;
  93 +} SysBusPCNetState;
  94 +
87 95 struct qemu_ether_header {
88 96 uint8_t ether_dhost[6];
89 97 uint8_t ether_shost[6];
... ... @@ -1593,8 +1601,7 @@ static void pcnet_h_reset(void *opaque)
1593 1601  
1594 1602 /* Initialize the PROM */
1595 1603  
1596   - if (s->nd)
1597   - memcpy(s->prom, s->nd->macaddr, 6);
  1604 + memcpy(s->prom, s->macaddr, 6);
1598 1605 s->prom[12] = s->prom[13] = 0x00;
1599 1606 s->prom[14] = s->prom[15] = 0x57;
1600 1607  
... ... @@ -1754,7 +1761,7 @@ static uint32_t pcnet_ioport_readl(void *opaque, uint32_t addr)
1754 1761 static void pcnet_ioport_map(PCIDevice *pci_dev, int region_num,
1755 1762 uint32_t addr, uint32_t size, int type)
1756 1763 {
1757   - PCNetState *d = (PCNetState *)pci_dev;
  1764 + PCNetState *d = &((PCIPCNetState *)pci_dev)->state;
1758 1765  
1759 1766 #ifdef PCNET_DEBUG_IO
1760 1767 printf("pcnet_ioport_map addr=0x%04x size=0x%04x\n", addr, size);
... ... @@ -1938,23 +1945,17 @@ static void pcnet_common_cleanup(PCNetState *d)
1938 1945 qemu_free_timer(d->poll_timer);
1939 1946 }
1940 1947  
1941   -static void pcnet_common_init(PCNetState *d, NICInfo *nd, NetCleanup *cleanup)
  1948 +static void pcnet_common_init(DeviceState *dev, PCNetState *s,
  1949 + NetCleanup *cleanup)
1942 1950 {
1943   - d->poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, d);
1944   -
1945   - d->nd = nd;
1946   -
1947   - if (nd && nd->vlan) {
1948   - d->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
1949   - pcnet_receive, pcnet_can_receive,
1950   - cleanup, d);
1951   -
1952   - qemu_format_nic_info_str(d->vc, d->nd->macaddr);
1953   - } else {
1954   - d->vc = NULL;
1955   - }
1956   - pcnet_h_reset(d);
1957   - register_savevm("pcnet", -1, 2, pcnet_save, pcnet_load, d);
  1951 + s->poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, s);
  1952 +
  1953 + qdev_get_macaddr(dev, s->macaddr);
  1954 + s->vc = qdev_get_vlan_client(dev,
  1955 + pcnet_receive, pcnet_can_receive,
  1956 + cleanup, s);
  1957 + pcnet_h_reset(s);
  1958 + register_savevm("pcnet", -1, 2, pcnet_save, pcnet_load, s);
1958 1959 }
1959 1960  
1960 1961 /* PCI interface */
... ... @@ -1974,13 +1975,13 @@ static CPUReadMemoryFunc *pcnet_mmio_read[] = {
1974 1975 static void pcnet_mmio_map(PCIDevice *pci_dev, int region_num,
1975 1976 uint32_t addr, uint32_t size, int type)
1976 1977 {
1977   - PCNetState *d = (PCNetState *)pci_dev;
  1978 + PCIPCNetState *d = (PCIPCNetState *)pci_dev;
1978 1979  
1979 1980 #ifdef PCNET_DEBUG_IO
1980 1981 printf("pcnet_mmio_map addr=0x%08x 0x%08x\n", addr, size);
1981 1982 #endif
1982 1983  
1983   - cpu_register_physical_memory(addr, PCNET_PNPMMIO_SIZE, d->mmio_index);
  1984 + cpu_register_physical_memory(addr, PCNET_PNPMMIO_SIZE, d->state.mmio_index);
1984 1985 }
1985 1986  
1986 1987 static void pci_physical_memory_write(void *dma_opaque, target_phys_addr_t addr,
... ... @@ -2004,16 +2005,17 @@ static void pci_pcnet_cleanup(VLANClientState *vc)
2004 2005  
2005 2006 static int pci_pcnet_uninit(PCIDevice *dev)
2006 2007 {
2007   - PCNetState *d = (PCNetState *)dev;
  2008 + PCIPCNetState *d = (PCIPCNetState *)dev;
2008 2009  
2009   - cpu_unregister_io_memory(d->mmio_index);
  2010 + cpu_unregister_io_memory(d->state.mmio_index);
2010 2011  
2011 2012 return 0;
2012 2013 }
2013 2014  
2014   -PCIDevice *pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn)
  2015 +static void pci_pcnet_init(PCIDevice *pci_dev)
2015 2016 {
2016   - PCNetState *d;
  2017 + PCIPCNetState *d = (PCIPCNetState *)pci_dev;
  2018 + PCNetState *s = &d->state;
2017 2019 uint8_t *pci_conf;
2018 2020  
2019 2021 #if 0
... ... @@ -2021,14 +2023,9 @@ PCIDevice *pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn)
2021 2023 sizeof(struct pcnet_RMD), sizeof(struct pcnet_TMD));
2022 2024 #endif
2023 2025  
2024   - d = (PCNetState *)pci_register_device(bus, "PCNet", sizeof(PCNetState),
2025   - devfn, NULL, NULL);
2026   - if (!d)
2027   - return NULL;
2028   -
2029   - d->dev.unregister = pci_pcnet_uninit;
  2026 + pci_dev->unregister = pci_pcnet_uninit;
2030 2027  
2031   - pci_conf = d->dev.config;
  2028 + pci_conf = pci_dev->config;
2032 2029  
2033 2030 pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_AMD);
2034 2031 pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_AMD_LANCE);
... ... @@ -2047,8 +2044,8 @@ PCIDevice *pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn)
2047 2044 pci_conf[0x3f] = 0xff;
2048 2045  
2049 2046 /* Handler for memory-mapped I/O */
2050   - d->mmio_index =
2051   - cpu_register_io_memory(0, pcnet_mmio_read, pcnet_mmio_write, d);
  2047 + s->mmio_index =
  2048 + cpu_register_io_memory(0, pcnet_mmio_read, pcnet_mmio_write, &d->state);
2052 2049  
2053 2050 pci_register_io_region((PCIDevice *)d, 0, PCNET_IOPORT_SIZE,
2054 2051 PCI_ADDRESS_SPACE_IO, pcnet_ioport_map);
... ... @@ -2056,14 +2053,12 @@ PCIDevice *pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn)
2056 2053 pci_register_io_region((PCIDevice *)d, 1, PCNET_PNPMMIO_SIZE,
2057 2054 PCI_ADDRESS_SPACE_MEM, pcnet_mmio_map);
2058 2055  
2059   - d->irq = d->dev.irq[0];
2060   - d->phys_mem_read = pci_physical_memory_read;
2061   - d->phys_mem_write = pci_physical_memory_write;
2062   - d->pci_dev = &d->dev;
  2056 + s->irq = pci_dev->irq[0];
  2057 + s->phys_mem_read = pci_physical_memory_read;
  2058 + s->phys_mem_write = pci_physical_memory_write;
  2059 + s->pci_dev = pci_dev;
2063 2060  
2064   - pcnet_common_init(d, nd, pci_pcnet_cleanup);
2065   -
2066   - return (PCIDevice *)d;
  2061 + pcnet_common_init(&pci_dev->qdev, s, pci_pcnet_cleanup);
2067 2062 }
2068 2063  
2069 2064 /* SPARC32 interface */
... ... @@ -2117,37 +2112,37 @@ static void lance_cleanup(VLANClientState *vc)
2117 2112 PCNetState *d = vc->opaque;
2118 2113  
2119 2114 pcnet_common_cleanup(d);
2120   -
2121   - qemu_free_irqs(d->reset_irq);
2122   -
2123   - cpu_unregister_io_memory(d->mmio_index);
2124   -
2125   - qemu_free(d);
2126 2115 }
2127 2116  
2128   -void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque,
2129   - qemu_irq irq, qemu_irq *reset)
  2117 +static void lance_init(SysBusDevice *dev)
2130 2118 {
2131   - PCNetState *d;
2132   -
2133   - qemu_check_nic_model(nd, "lance");
  2119 + SysBusPCNetState *d = FROM_SYSBUS(SysBusPCNetState, dev);
  2120 + PCNetState *s = &d->state;
2134 2121  
2135   - d = qemu_mallocz(sizeof(PCNetState));
2136   -
2137   - d->mmio_index =
  2122 + s->mmio_index =
2138 2123 cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d);
2139 2124  
2140   - d->dma_opaque = dma_opaque;
  2125 + s->dma_opaque = qdev_get_prop_ptr(&dev->qdev, "dma");
  2126 +
  2127 + qdev_init_irq_sink(&dev->qdev, parent_lance_reset, 1);
2141 2128  
2142   - d->reset_irq = qemu_allocate_irqs(parent_lance_reset, d, 1);
2143   - *reset = *d->reset_irq;
  2129 + sysbus_init_mmio(dev, 4, s->mmio_index);
2144 2130  
2145   - cpu_register_physical_memory(leaddr, 4, d->mmio_index);
  2131 + sysbus_init_irq(dev, &s->irq);
2146 2132  
2147   - d->irq = irq;
2148   - d->phys_mem_read = ledma_memory_read;
2149   - d->phys_mem_write = ledma_memory_write;
  2133 + s->phys_mem_read = ledma_memory_read;
  2134 + s->phys_mem_write = ledma_memory_write;
2150 2135  
2151   - pcnet_common_init(d, nd, lance_cleanup);
  2136 + pcnet_common_init(&dev->qdev, s, lance_cleanup);
2152 2137 }
2153 2138 #endif /* TARGET_SPARC */
  2139 +
  2140 +static void pcnet_register_devices(void)
  2141 +{
  2142 + pci_qdev_register("pcnet", sizeof(PCIPCNetState), pci_pcnet_init);
  2143 +#if defined (TARGET_SPARC) && !defined(TARGET_SPARC64)
  2144 + sysbus_register_dev("lance", sizeof(SysBusPCNetState), lance_init);
  2145 +#endif
  2146 +}
  2147 +
  2148 +device_init(pcnet_register_devices)
... ...
hw/qdev.c
... ... @@ -26,6 +26,7 @@
26 26 inherit from a particular bus (e.g. PCI or I2C) rather than
27 27 this API directly. */
28 28  
  29 +#include "net.h"
29 30 #include "qdev.h"
30 31 #include "sysemu.h"
31 32  
... ... @@ -135,6 +136,12 @@ void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value)
135 136 prop->value.ptr = value;
136 137 }
137 138  
  139 +void qdev_set_netdev(DeviceState *dev, NICInfo *nd)
  140 +{
  141 + assert(!dev->nd);
  142 + dev->nd = nd;
  143 +}
  144 +
138 145  
139 146 qemu_irq qdev_get_irq_sink(DeviceState *dev, int n)
140 147 {
... ... @@ -225,6 +232,24 @@ void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
225 232 dev->gpio_out[n] = pin;
226 233 }
227 234  
  235 +VLANClientState *qdev_get_vlan_client(DeviceState *dev,
  236 + IOReadHandler *fd_read,
  237 + IOCanRWHandler *fd_can_read,
  238 + NetCleanup *cleanup,
  239 + void *opaque)
  240 +{
  241 + NICInfo *nd = dev->nd;
  242 + assert(nd);
  243 + return qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
  244 + fd_read, fd_can_read, cleanup, opaque);
  245 +}
  246 +
  247 +
  248 +void qdev_get_macaddr(DeviceState *dev, uint8_t *macaddr)
  249 +{
  250 + memcpy(macaddr, dev->nd->macaddr, 6);
  251 +}
  252 +
228 253 static int next_block_unit[IF_COUNT];
229 254  
230 255 /* Get a block device. This should only be used for single-drive devices
... ...
hw/qdev.h
... ... @@ -24,6 +24,7 @@ struct DeviceState
24 24 int num_gpio_in;
25 25 qemu_irq *gpio_in;
26 26 ChildBusList *child_bus;
  27 + NICInfo *nd;
27 28 };
28 29  
29 30 /*** Board API. This should go away once we have a machine config file. ***/
... ... @@ -34,6 +35,7 @@ void qdev_init(DeviceState *dev);
34 35 /* Set properties between creation and init. */
35 36 void qdev_set_prop_int(DeviceState *dev, const char *name, int value);
36 37 void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value);
  38 +void qdev_set_netdev(DeviceState *dev, NICInfo *nd);
37 39  
38 40 qemu_irq qdev_get_irq_sink(DeviceState *dev, int n);
39 41 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
... ...
hw/rtl8139.c
... ... @@ -3441,19 +3441,12 @@ static int pci_rtl8139_uninit(PCIDevice *dev)
3441 3441 return 0;
3442 3442 }
3443 3443  
3444   -PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn)
  3444 +static void pci_rtl8139_init(PCIDevice *dev)
3445 3445 {
3446   - PCIRTL8139State *d;
  3446 + PCIRTL8139State *d = (PCIRTL8139State *)dev;
3447 3447 RTL8139State *s;
3448 3448 uint8_t *pci_conf;
3449 3449  
3450   - d = (PCIRTL8139State *)pci_register_device(bus,
3451   - "RTL8139", sizeof(PCIRTL8139State),
3452   - devfn,
3453   - NULL, NULL);
3454   - if (!d)
3455   - return NULL;
3456   -
3457 3450 d->dev.unregister = pci_rtl8139_uninit;
3458 3451  
3459 3452 pci_conf = d->dev.config;
... ... @@ -3479,9 +3472,9 @@ PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn)
3479 3472 PCI_ADDRESS_SPACE_MEM, rtl8139_mmio_map);
3480 3473  
3481 3474 s->pci_dev = (PCIDevice *)d;
3482   - memcpy(s->macaddr, nd->macaddr, 6);
  3475 + qdev_get_macaddr(&dev->qdev, s->macaddr);
3483 3476 rtl8139_reset(s);
3484   - s->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
  3477 + s->vc = qdev_get_vlan_client(&dev->qdev,
3485 3478 rtl8139_receive, rtl8139_can_receive,
3486 3479 rtl8139_cleanup, s);
3487 3480  
... ... @@ -3499,5 +3492,11 @@ PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn)
3499 3492 qemu_mod_timer(s->timer,
3500 3493 rtl8139_get_next_tctr_time(s,qemu_get_clock(vm_clock)));
3501 3494 #endif /* RTL8139_ONBOARD_TIMER */
3502   - return (PCIDevice *)d;
3503 3495 }
  3496 +
  3497 +static void rtl8139_register_devices(void)
  3498 +{
  3499 + pci_qdev_register("rtl8139", sizeof(PCIRTL8139State), pci_rtl8139_init);
  3500 +}
  3501 +
  3502 +device_init(rtl8139_register_devices)
... ...
hw/sun4m.c
... ... @@ -21,7 +21,7 @@
21 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 22 * THE SOFTWARE.
23 23 */
24   -#include "hw.h"
  24 +#include "sysbus.h"
25 25 #include "qemu-timer.h"
26 26 #include "sun4m.h"
27 27 #include "nvram.h"
... ... @@ -364,6 +364,24 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
364 364 return kernel_size;
365 365 }
366 366  
  367 +static void lance_init(NICInfo *nd, target_phys_addr_t leaddr,
  368 + void *dma_opaque, qemu_irq irq, qemu_irq *reset)
  369 +{
  370 + DeviceState *dev;
  371 + SysBusDevice *s;
  372 +
  373 + qemu_check_nic_model(&nd_table[0], "lance");
  374 +
  375 + dev = qdev_create(NULL, "lance");
  376 + qdev_set_netdev(dev, nd);
  377 + qdev_set_prop_ptr(dev, "dma", dma_opaque);
  378 + qdev_init(dev);
  379 + s = sysbus_from_qdev(dev);
  380 + sysbus_mmio_map(s, 0, leaddr);
  381 + sysbus_connect_irq(s, 0, irq);
  382 + *reset = qdev_get_irq_sink(dev, 0);
  383 +}
  384 +
367 385 static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
368 386 const char *boot_device,
369 387 const char *kernel_filename,
... ...
hw/sun4m.h
... ... @@ -62,10 +62,6 @@ void cs_init(target_phys_addr_t base, int irq, void *intctl);
62 62 /* sparc32_dma.c */
63 63 #include "sparc32_dma.h"
64 64  
65   -/* pcnet.c */
66   -void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque,
67   - qemu_irq irq, qemu_irq *reset);
68   -
69 65 /* eccmemctl.c */
70 66 void *ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version);
71 67  
... ...
... ... @@ -127,4 +127,11 @@ void net_host_device_remove(Monitor *mon, int vlan_id, const char *device);
127 127 #define SMBD_COMMAND "/usr/sbin/smbd"
128 128 #endif
129 129  
  130 +void qdev_get_macaddr(DeviceState *dev, uint8_t *macaddr);
  131 +VLANClientState *qdev_get_vlan_client(DeviceState *dev,
  132 + IOReadHandler *fd_read,
  133 + IOCanRWHandler *fd_can_read,
  134 + NetCleanup *cleanup,
  135 + void *opaque);
  136 +
130 137 #endif
... ...