Commit 9d07d7579bcaf01e05c511c63d091ed2ac310091
1 parent
9be5dafe
PCI network qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
12 changed files
with
190 additions
and
166 deletions
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 | ... | ... |
net.h
| ... | ... | @@ -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 | ... | ... |