Revision fbdaa002 hw/e1000.c
b/hw/e1000.c | ||
---|---|---|
25 | 25 |
#include "hw.h" |
26 | 26 |
#include "pci.h" |
27 | 27 |
#include "net.h" |
28 |
#include "loader.h" |
|
28 | 29 |
|
29 | 30 |
#include "e1000_hw.h" |
30 | 31 |
|
... | ... | |
74 | 75 |
typedef struct E1000State_st { |
75 | 76 |
PCIDevice dev; |
76 | 77 |
VLANClientState *vc; |
78 |
NICConf conf; |
|
77 | 79 |
int mmio_index; |
78 | 80 |
|
79 | 81 |
uint32_t mac_reg[0x8000]; |
... | ... | |
1056 | 1058 |
{ |
1057 | 1059 |
E1000State *d = vc->opaque; |
1058 | 1060 |
|
1059 |
unregister_savevm("e1000", d);
|
|
1061 |
d->vc = NULL;
|
|
1060 | 1062 |
} |
1061 | 1063 |
|
1062 | 1064 |
static int |
... | ... | |
1065 | 1067 |
E1000State *d = DO_UPCAST(E1000State, dev, dev); |
1066 | 1068 |
|
1067 | 1069 |
cpu_unregister_io_memory(d->mmio_index); |
1068 |
|
|
1070 |
qemu_del_vlan_client(d->vc); |
|
1071 |
unregister_savevm("e1000", d); |
|
1069 | 1072 |
return 0; |
1070 | 1073 |
} |
1071 | 1074 |
|
... | ... | |
1088 | 1091 |
uint16_t checksum = 0; |
1089 | 1092 |
static const char info_str[] = "e1000"; |
1090 | 1093 |
int i; |
1091 |
uint8_t macaddr[6];
|
|
1094 |
uint8_t *macaddr;
|
|
1092 | 1095 |
|
1093 | 1096 |
pci_conf = d->dev.config; |
1094 | 1097 |
|
... | ... | |
1113 | 1116 |
|
1114 | 1117 |
memmove(d->eeprom_data, e1000_eeprom_template, |
1115 | 1118 |
sizeof e1000_eeprom_template); |
1116 |
qdev_get_macaddr(&d->dev.qdev, macaddr); |
|
1119 |
qemu_macaddr_default_if_unset(&d->conf.macaddr); |
|
1120 |
macaddr = d->conf.macaddr.a; |
|
1117 | 1121 |
for (i = 0; i < 3; i++) |
1118 | 1122 |
d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i]; |
1119 | 1123 |
for (i = 0; i < EEPROM_CHECKSUM_REG; i++) |
... | ... | |
1121 | 1125 |
checksum = (uint16_t) EEPROM_SUM - checksum; |
1122 | 1126 |
d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum; |
1123 | 1127 |
|
1124 |
d->vc = qdev_get_vlan_client(&d->dev.qdev, |
|
1125 |
e1000_can_receive, e1000_receive, |
|
1128 |
d->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, |
|
1129 |
d->conf.vlan, d->conf.peer, |
|
1130 |
d->dev.qdev.info->name, d->dev.qdev.id, |
|
1131 |
e1000_can_receive, e1000_receive, NULL, |
|
1126 | 1132 |
NULL, e1000_cleanup, d); |
1127 | 1133 |
d->vc->link_status_changed = e1000_set_link_status; |
1128 | 1134 |
|
1129 | 1135 |
qemu_format_nic_info_str(d->vc, macaddr); |
1130 | 1136 |
|
1131 | 1137 |
register_savevm(info_str, -1, 2, nic_save, nic_load, d); |
1132 |
qemu_register_reset(e1000_reset, d); |
|
1133 | 1138 |
e1000_reset(d); |
1139 |
|
|
1140 |
#if 0 /* rom bev support is broken -> can't load unconditionally */ |
|
1141 |
if (!pci_dev->qdev.hotplugged) { |
|
1142 |
static int loaded = 0; |
|
1143 |
if (!loaded) { |
|
1144 |
rom_add_option("pxe-e1000.bin"); |
|
1145 |
loaded = 1; |
|
1146 |
} |
|
1147 |
} |
|
1148 |
#endif |
|
1134 | 1149 |
return 0; |
1135 | 1150 |
} |
1136 | 1151 |
|
1152 |
static void qdev_e1000_reset(DeviceState *dev) |
|
1153 |
{ |
|
1154 |
E1000State *d = DO_UPCAST(E1000State, dev.qdev, dev); |
|
1155 |
e1000_reset(d); |
|
1156 |
} |
|
1157 |
|
|
1137 | 1158 |
static PCIDeviceInfo e1000_info = { |
1138 |
.qdev.name = "e1000", |
|
1139 |
.qdev.size = sizeof(E1000State), |
|
1140 |
.init = pci_e1000_init, |
|
1141 |
.exit = pci_e1000_uninit, |
|
1159 |
.qdev.name = "e1000", |
|
1160 |
.qdev.desc = "Intel Gigabit Ethernet", |
|
1161 |
.qdev.size = sizeof(E1000State), |
|
1162 |
.qdev.reset = qdev_e1000_reset, |
|
1163 |
.init = pci_e1000_init, |
|
1164 |
.exit = pci_e1000_uninit, |
|
1165 |
.qdev.props = (Property[]) { |
|
1166 |
DEFINE_NIC_PROPERTIES(E1000State, conf), |
|
1167 |
DEFINE_PROP_END_OF_LIST(), |
|
1168 |
} |
|
1142 | 1169 |
}; |
1143 | 1170 |
|
1144 | 1171 |
static void e1000_register_devices(void) |
Also available in: Unified diff