Revision 9d07d757
b/hw/e1000.c | ||
---|---|---|
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 | 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 | 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) |
b/hw/eepro100.c | ||
---|---|---|
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 | 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 | 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) |
b/hw/ne2000.c | ||
---|---|---|
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 | 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) |
b/hw/pci.c | ||
---|---|---|
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 | 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 |
} |
b/hw/pci.h | ||
---|---|---|
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 |
|
b/hw/pcnet.c | ||
---|---|---|
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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) |
b/hw/qdev.c | ||
---|---|---|
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 | 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 | 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 |
b/hw/qdev.h | ||
---|---|---|
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 | 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); |
b/hw/rtl8139.c | ||
---|---|---|
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 | 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 | 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) |
b/hw/sun4m.c | ||
---|---|---|
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 | 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, |
b/hw/sun4m.h | ||
---|---|---|
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 |
|
b/net.h | ||
---|---|---|
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 |
Also available in: Unified diff