e1000: switch to symbolic names for pci registers
[qemu.git] / hw / e1000.c
blob51c9d7d81b8be39a21f58ade339659351d05c195
1 /*
2 * QEMU e1000 emulation
4 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
5 * Copyright (c) 2008 Qumranet
6 * Based on work done by:
7 * Copyright (c) 2007 Dan Aloni
8 * Copyright (c) 2004 Antony T Curtis
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
25 #include "hw.h"
26 #include "pci.h"
27 #include "net.h"
28 #include "net/checksum.h"
29 #include "loader.h"
31 #include "e1000_hw.h"
33 #define DEBUG
35 #ifdef DEBUG
36 enum {
37 DEBUG_GENERAL, DEBUG_IO, DEBUG_MMIO, DEBUG_INTERRUPT,
38 DEBUG_RX, DEBUG_TX, DEBUG_MDIC, DEBUG_EEPROM,
39 DEBUG_UNKNOWN, DEBUG_TXSUM, DEBUG_TXERR, DEBUG_RXERR,
40 DEBUG_RXFILTER, DEBUG_NOTYET,
42 #define DBGBIT(x) (1<<DEBUG_##x)
43 static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
45 #define DBGOUT(what, fmt, ...) do { \
46 if (debugflags & DBGBIT(what)) \
47 fprintf(stderr, "e1000: " fmt, ## __VA_ARGS__); \
48 } while (0)
49 #else
50 #define DBGOUT(what, fmt, ...) do {} while (0)
51 #endif
53 #define IOPORT_SIZE 0x40
54 #define PNPMMIO_SIZE 0x20000
57 * HW models:
58 * E1000_DEV_ID_82540EM works with Windows and Linux
59 * E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
60 * appears to perform better than 82540EM, but breaks with Linux 2.6.18
61 * E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
62 * Others never tested
64 enum { E1000_DEVID = E1000_DEV_ID_82540EM };
67 * May need to specify additional MAC-to-PHY entries --
68 * Intel's Windows driver refuses to initialize unless they match
70 enum {
71 PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ? 0xcc2 :
72 E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ? 0xc30 :
73 /* default to E1000_DEV_ID_82540EM */ 0xc20
76 typedef struct E1000State_st {
77 PCIDevice dev;
78 NICState *nic;
79 NICConf conf;
80 int mmio_index;
82 uint32_t mac_reg[0x8000];
83 uint16_t phy_reg[0x20];
84 uint16_t eeprom_data[64];
86 uint32_t rxbuf_size;
87 uint32_t rxbuf_min_shift;
88 int check_rxov;
89 struct e1000_tx {
90 unsigned char header[256];
91 unsigned char vlan_header[4];
92 /* Fields vlan and data must not be reordered or separated. */
93 unsigned char vlan[4];
94 unsigned char data[0x10000];
95 uint16_t size;
96 unsigned char sum_needed;
97 unsigned char vlan_needed;
98 uint8_t ipcss;
99 uint8_t ipcso;
100 uint16_t ipcse;
101 uint8_t tucss;
102 uint8_t tucso;
103 uint16_t tucse;
104 uint8_t hdr_len;
105 uint16_t mss;
106 uint32_t paylen;
107 uint16_t tso_frames;
108 char tse;
109 int8_t ip;
110 int8_t tcp;
111 char cptse; // current packet tse bit
112 } tx;
114 struct {
115 uint32_t val_in; // shifted in from guest driver
116 uint16_t bitnum_in;
117 uint16_t bitnum_out;
118 uint16_t reading;
119 uint32_t old_eecd;
120 } eecd_state;
121 } E1000State;
123 #define defreg(x) x = (E1000_##x>>2)
124 enum {
125 defreg(CTRL), defreg(EECD), defreg(EERD), defreg(GPRC),
126 defreg(GPTC), defreg(ICR), defreg(ICS), defreg(IMC),
127 defreg(IMS), defreg(LEDCTL), defreg(MANC), defreg(MDIC),
128 defreg(MPC), defreg(PBA), defreg(RCTL), defreg(RDBAH),
129 defreg(RDBAL), defreg(RDH), defreg(RDLEN), defreg(RDT),
130 defreg(STATUS), defreg(SWSM), defreg(TCTL), defreg(TDBAH),
131 defreg(TDBAL), defreg(TDH), defreg(TDLEN), defreg(TDT),
132 defreg(TORH), defreg(TORL), defreg(TOTH), defreg(TOTL),
133 defreg(TPR), defreg(TPT), defreg(TXDCTL), defreg(WUFC),
134 defreg(RA), defreg(MTA), defreg(CRCERRS),defreg(VFTA),
135 defreg(VET),
138 enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
139 static const char phy_regcap[0x20] = {
140 [PHY_STATUS] = PHY_R, [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
141 [PHY_ID1] = PHY_R, [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
142 [PHY_CTRL] = PHY_RW, [PHY_1000T_CTRL] = PHY_RW,
143 [PHY_LP_ABILITY] = PHY_R, [PHY_1000T_STATUS] = PHY_R,
144 [PHY_AUTONEG_ADV] = PHY_RW, [M88E1000_RX_ERR_CNTR] = PHY_R,
145 [PHY_ID2] = PHY_R, [M88E1000_PHY_SPEC_STATUS] = PHY_R
148 static void
149 ioport_map(PCIDevice *pci_dev, int region_num, pcibus_t addr,
150 pcibus_t size, int type)
152 DBGOUT(IO, "e1000_ioport_map addr=0x%04"FMT_PCIBUS
153 " size=0x%08"FMT_PCIBUS"\n", addr, size);
156 static void
157 set_interrupt_cause(E1000State *s, int index, uint32_t val)
159 if (val)
160 val |= E1000_ICR_INT_ASSERTED;
161 s->mac_reg[ICR] = val;
162 s->mac_reg[ICS] = val;
163 qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
166 static void
167 set_ics(E1000State *s, int index, uint32_t val)
169 DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
170 s->mac_reg[IMS]);
171 set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
174 static int
175 rxbufsize(uint32_t v)
177 v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
178 E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
179 E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
180 switch (v) {
181 case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
182 return 16384;
183 case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
184 return 8192;
185 case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
186 return 4096;
187 case E1000_RCTL_SZ_1024:
188 return 1024;
189 case E1000_RCTL_SZ_512:
190 return 512;
191 case E1000_RCTL_SZ_256:
192 return 256;
194 return 2048;
197 static void
198 set_ctrl(E1000State *s, int index, uint32_t val)
200 /* RST is self clearing */
201 s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
204 static void
205 set_rx_control(E1000State *s, int index, uint32_t val)
207 s->mac_reg[RCTL] = val;
208 s->rxbuf_size = rxbufsize(val);
209 s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
210 DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
211 s->mac_reg[RCTL]);
214 static void
215 set_mdic(E1000State *s, int index, uint32_t val)
217 uint32_t data = val & E1000_MDIC_DATA_MASK;
218 uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
220 if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
221 val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
222 else if (val & E1000_MDIC_OP_READ) {
223 DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
224 if (!(phy_regcap[addr] & PHY_R)) {
225 DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
226 val |= E1000_MDIC_ERROR;
227 } else
228 val = (val ^ data) | s->phy_reg[addr];
229 } else if (val & E1000_MDIC_OP_WRITE) {
230 DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
231 if (!(phy_regcap[addr] & PHY_W)) {
232 DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
233 val |= E1000_MDIC_ERROR;
234 } else
235 s->phy_reg[addr] = data;
237 s->mac_reg[MDIC] = val | E1000_MDIC_READY;
238 set_ics(s, 0, E1000_ICR_MDAC);
241 static uint32_t
242 get_eecd(E1000State *s, int index)
244 uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
246 DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
247 s->eecd_state.bitnum_out, s->eecd_state.reading);
248 if (!s->eecd_state.reading ||
249 ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
250 ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
251 ret |= E1000_EECD_DO;
252 return ret;
255 static void
256 set_eecd(E1000State *s, int index, uint32_t val)
258 uint32_t oldval = s->eecd_state.old_eecd;
260 s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
261 E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
262 if (!(E1000_EECD_SK & (val ^ oldval))) // no clock edge
263 return;
264 if (!(E1000_EECD_SK & val)) { // falling edge
265 s->eecd_state.bitnum_out++;
266 return;
268 if (!(val & E1000_EECD_CS)) { // rising, no CS (EEPROM reset)
269 memset(&s->eecd_state, 0, sizeof s->eecd_state);
271 * restore old_eecd's E1000_EECD_SK (known to be on)
272 * to avoid false detection of a clock edge
274 s->eecd_state.old_eecd = E1000_EECD_SK;
275 return;
277 s->eecd_state.val_in <<= 1;
278 if (val & E1000_EECD_DI)
279 s->eecd_state.val_in |= 1;
280 if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
281 s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
282 s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
283 EEPROM_READ_OPCODE_MICROWIRE);
285 DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
286 s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
287 s->eecd_state.reading);
290 static uint32_t
291 flash_eerd_read(E1000State *s, int x)
293 unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
295 if ((s->mac_reg[EERD] & E1000_EEPROM_RW_REG_START) == 0)
296 return (s->mac_reg[EERD]);
298 if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
299 return (E1000_EEPROM_RW_REG_DONE | r);
301 return ((s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
302 E1000_EEPROM_RW_REG_DONE | r);
305 static void
306 putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
308 uint32_t sum;
310 if (cse && cse < n)
311 n = cse + 1;
312 if (sloc < n-1) {
313 sum = net_checksum_add(n-css, data+css);
314 cpu_to_be16wu((uint16_t *)(data + sloc),
315 net_checksum_finish(sum));
319 static inline int
320 vlan_enabled(E1000State *s)
322 return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
325 static inline int
326 vlan_rx_filter_enabled(E1000State *s)
328 return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
331 static inline int
332 is_vlan_packet(E1000State *s, const uint8_t *buf)
334 return (be16_to_cpup((uint16_t *)(buf + 12)) ==
335 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
338 static inline int
339 is_vlan_txd(uint32_t txd_lower)
341 return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
344 static void
345 xmit_seg(E1000State *s)
347 uint16_t len, *sp;
348 unsigned int frames = s->tx.tso_frames, css, sofar, n;
349 struct e1000_tx *tp = &s->tx;
351 if (tp->tse && tp->cptse) {
352 css = tp->ipcss;
353 DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
354 frames, tp->size, css);
355 if (tp->ip) { // IPv4
356 cpu_to_be16wu((uint16_t *)(tp->data+css+2),
357 tp->size - css);
358 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
359 be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
360 } else // IPv6
361 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
362 tp->size - css);
363 css = tp->tucss;
364 len = tp->size - css;
365 DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
366 if (tp->tcp) {
367 sofar = frames * tp->mss;
368 cpu_to_be32wu((uint32_t *)(tp->data+css+4), // seq
369 be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
370 if (tp->paylen - sofar > tp->mss)
371 tp->data[css + 13] &= ~9; // PSH, FIN
372 } else // UDP
373 cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
374 if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
375 // add pseudo-header length before checksum calculation
376 sp = (uint16_t *)(tp->data + tp->tucso);
377 cpu_to_be16wu(sp, be16_to_cpup(sp) + len);
379 tp->tso_frames++;
382 if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
383 putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
384 if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
385 putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
386 if (tp->vlan_needed) {
387 memmove(tp->vlan, tp->data, 4);
388 memmove(tp->data, tp->data + 4, 8);
389 memcpy(tp->data + 8, tp->vlan_header, 4);
390 qemu_send_packet(&s->nic->nc, tp->vlan, tp->size + 4);
391 } else
392 qemu_send_packet(&s->nic->nc, tp->data, tp->size);
393 s->mac_reg[TPT]++;
394 s->mac_reg[GPTC]++;
395 n = s->mac_reg[TOTL];
396 if ((s->mac_reg[TOTL] += s->tx.size) < n)
397 s->mac_reg[TOTH]++;
400 static void
401 process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
403 uint32_t txd_lower = le32_to_cpu(dp->lower.data);
404 uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
405 unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
406 unsigned int msh = 0xfffff, hdr = 0;
407 uint64_t addr;
408 struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
409 struct e1000_tx *tp = &s->tx;
411 if (dtype == E1000_TXD_CMD_DEXT) { // context descriptor
412 op = le32_to_cpu(xp->cmd_and_length);
413 tp->ipcss = xp->lower_setup.ip_fields.ipcss;
414 tp->ipcso = xp->lower_setup.ip_fields.ipcso;
415 tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
416 tp->tucss = xp->upper_setup.tcp_fields.tucss;
417 tp->tucso = xp->upper_setup.tcp_fields.tucso;
418 tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
419 tp->paylen = op & 0xfffff;
420 tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
421 tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
422 tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
423 tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
424 tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
425 tp->tso_frames = 0;
426 if (tp->tucso == 0) { // this is probably wrong
427 DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
428 tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
430 return;
431 } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
432 // data descriptor
433 tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
434 tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
435 } else
436 // legacy descriptor
437 tp->cptse = 0;
439 if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
440 (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
441 tp->vlan_needed = 1;
442 cpu_to_be16wu((uint16_t *)(tp->vlan_header),
443 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
444 cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
445 le16_to_cpu(dp->upper.fields.special));
448 addr = le64_to_cpu(dp->buffer_addr);
449 if (tp->tse && tp->cptse) {
450 hdr = tp->hdr_len;
451 msh = hdr + tp->mss;
452 do {
453 bytes = split_size;
454 if (tp->size + bytes > msh)
455 bytes = msh - tp->size;
456 cpu_physical_memory_read(addr, tp->data + tp->size, bytes);
457 if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
458 memmove(tp->header, tp->data, hdr);
459 tp->size = sz;
460 addr += bytes;
461 if (sz == msh) {
462 xmit_seg(s);
463 memmove(tp->data, tp->header, hdr);
464 tp->size = hdr;
466 } while (split_size -= bytes);
467 } else if (!tp->tse && tp->cptse) {
468 // context descriptor TSE is not set, while data descriptor TSE is set
469 DBGOUT(TXERR, "TCP segmentaion Error\n");
470 } else {
471 cpu_physical_memory_read(addr, tp->data + tp->size, split_size);
472 tp->size += split_size;
475 if (!(txd_lower & E1000_TXD_CMD_EOP))
476 return;
477 if (!(tp->tse && tp->cptse && tp->size < hdr))
478 xmit_seg(s);
479 tp->tso_frames = 0;
480 tp->sum_needed = 0;
481 tp->vlan_needed = 0;
482 tp->size = 0;
483 tp->cptse = 0;
486 static uint32_t
487 txdesc_writeback(target_phys_addr_t base, struct e1000_tx_desc *dp)
489 uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
491 if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
492 return 0;
493 txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
494 ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
495 dp->upper.data = cpu_to_le32(txd_upper);
496 cpu_physical_memory_write(base + ((char *)&dp->upper - (char *)dp),
497 (void *)&dp->upper, sizeof(dp->upper));
498 return E1000_ICR_TXDW;
501 static void
502 start_xmit(E1000State *s)
504 target_phys_addr_t base;
505 struct e1000_tx_desc desc;
506 uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
508 if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
509 DBGOUT(TX, "tx disabled\n");
510 return;
513 while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
514 base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
515 sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
516 cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
518 DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
519 (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
520 desc.upper.data);
522 process_tx_desc(s, &desc);
523 cause |= txdesc_writeback(base, &desc);
525 if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
526 s->mac_reg[TDH] = 0;
528 * the following could happen only if guest sw assigns
529 * bogus values to TDT/TDLEN.
530 * there's nothing too intelligent we could do about this.
532 if (s->mac_reg[TDH] == tdh_start) {
533 DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
534 tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
535 break;
538 set_ics(s, 0, cause);
541 static int
542 receive_filter(E1000State *s, const uint8_t *buf, int size)
544 static uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
545 static int mta_shift[] = {4, 3, 2, 0};
546 uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
548 if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
549 uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
550 uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
551 ((vid >> 5) & 0x7f));
552 if ((vfta & (1 << (vid & 0x1f))) == 0)
553 return 0;
556 if (rctl & E1000_RCTL_UPE) // promiscuous
557 return 1;
559 if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE)) // promiscuous mcast
560 return 1;
562 if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
563 return 1;
565 for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
566 if (!(rp[1] & E1000_RAH_AV))
567 continue;
568 ra[0] = cpu_to_le32(rp[0]);
569 ra[1] = cpu_to_le32(rp[1]);
570 if (!memcmp(buf, (uint8_t *)ra, 6)) {
571 DBGOUT(RXFILTER,
572 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
573 (int)(rp - s->mac_reg - RA)/2,
574 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
575 return 1;
578 DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
579 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
581 f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
582 f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
583 if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
584 return 1;
585 DBGOUT(RXFILTER,
586 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
587 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
588 (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
589 s->mac_reg[MTA + (f >> 5)]);
591 return 0;
594 static void
595 e1000_set_link_status(VLANClientState *nc)
597 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
598 uint32_t old_status = s->mac_reg[STATUS];
600 if (nc->link_down)
601 s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
602 else
603 s->mac_reg[STATUS] |= E1000_STATUS_LU;
605 if (s->mac_reg[STATUS] != old_status)
606 set_ics(s, 0, E1000_ICR_LSC);
609 static int
610 e1000_can_receive(VLANClientState *nc)
612 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
614 return (s->mac_reg[RCTL] & E1000_RCTL_EN);
617 static ssize_t
618 e1000_receive(VLANClientState *nc, const uint8_t *buf, size_t size)
620 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
621 struct e1000_rx_desc desc;
622 target_phys_addr_t base;
623 unsigned int n, rdt;
624 uint32_t rdh_start;
625 uint16_t vlan_special = 0;
626 uint8_t vlan_status = 0, vlan_offset = 0;
628 if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
629 return -1;
631 if (size > s->rxbuf_size) {
632 DBGOUT(RX, "packet too large for buffers (%lu > %d)\n",
633 (unsigned long)size, s->rxbuf_size);
634 return -1;
637 if (!receive_filter(s, buf, size))
638 return size;
640 if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
641 vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
642 memmove((void *)(buf + 4), buf, 12);
643 vlan_status = E1000_RXD_STAT_VP;
644 vlan_offset = 4;
645 size -= 4;
648 rdh_start = s->mac_reg[RDH];
649 size += 4; // for the header
650 do {
651 if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) {
652 set_ics(s, 0, E1000_ICS_RXO);
653 return -1;
655 base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
656 sizeof(desc) * s->mac_reg[RDH];
657 cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
658 desc.special = vlan_special;
659 desc.status |= (vlan_status | E1000_RXD_STAT_DD);
660 if (desc.buffer_addr) {
661 cpu_physical_memory_write(le64_to_cpu(desc.buffer_addr),
662 (void *)(buf + vlan_offset), size);
663 desc.length = cpu_to_le16(size);
664 desc.status |= E1000_RXD_STAT_EOP|E1000_RXD_STAT_IXSM;
665 } else // as per intel docs; skip descriptors with null buf addr
666 DBGOUT(RX, "Null RX descriptor!!\n");
667 cpu_physical_memory_write(base, (void *)&desc, sizeof(desc));
669 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
670 s->mac_reg[RDH] = 0;
671 s->check_rxov = 1;
672 /* see comment in start_xmit; same here */
673 if (s->mac_reg[RDH] == rdh_start) {
674 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
675 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
676 set_ics(s, 0, E1000_ICS_RXO);
677 return -1;
679 } while (desc.buffer_addr == 0);
681 s->mac_reg[GPRC]++;
682 s->mac_reg[TPR]++;
683 n = s->mac_reg[TORL];
684 if ((s->mac_reg[TORL] += size) < n)
685 s->mac_reg[TORH]++;
687 n = E1000_ICS_RXT0;
688 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
689 rdt += s->mac_reg[RDLEN] / sizeof(desc);
690 if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
691 s->rxbuf_min_shift)
692 n |= E1000_ICS_RXDMT0;
694 set_ics(s, 0, n);
696 return size;
699 static uint32_t
700 mac_readreg(E1000State *s, int index)
702 return s->mac_reg[index];
705 static uint32_t
706 mac_icr_read(E1000State *s, int index)
708 uint32_t ret = s->mac_reg[ICR];
710 DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
711 set_interrupt_cause(s, 0, 0);
712 return ret;
715 static uint32_t
716 mac_read_clr4(E1000State *s, int index)
718 uint32_t ret = s->mac_reg[index];
720 s->mac_reg[index] = 0;
721 return ret;
724 static uint32_t
725 mac_read_clr8(E1000State *s, int index)
727 uint32_t ret = s->mac_reg[index];
729 s->mac_reg[index] = 0;
730 s->mac_reg[index-1] = 0;
731 return ret;
734 static void
735 mac_writereg(E1000State *s, int index, uint32_t val)
737 s->mac_reg[index] = val;
740 static void
741 set_rdt(E1000State *s, int index, uint32_t val)
743 s->check_rxov = 0;
744 s->mac_reg[index] = val & 0xffff;
747 static void
748 set_16bit(E1000State *s, int index, uint32_t val)
750 s->mac_reg[index] = val & 0xffff;
753 static void
754 set_dlen(E1000State *s, int index, uint32_t val)
756 s->mac_reg[index] = val & 0xfff80;
759 static void
760 set_tctl(E1000State *s, int index, uint32_t val)
762 s->mac_reg[index] = val;
763 s->mac_reg[TDT] &= 0xffff;
764 start_xmit(s);
767 static void
768 set_icr(E1000State *s, int index, uint32_t val)
770 DBGOUT(INTERRUPT, "set_icr %x\n", val);
771 set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
774 static void
775 set_imc(E1000State *s, int index, uint32_t val)
777 s->mac_reg[IMS] &= ~val;
778 set_ics(s, 0, 0);
781 static void
782 set_ims(E1000State *s, int index, uint32_t val)
784 s->mac_reg[IMS] |= val;
785 set_ics(s, 0, 0);
788 #define getreg(x) [x] = mac_readreg
789 static uint32_t (*macreg_readops[])(E1000State *, int) = {
790 getreg(PBA), getreg(RCTL), getreg(TDH), getreg(TXDCTL),
791 getreg(WUFC), getreg(TDT), getreg(CTRL), getreg(LEDCTL),
792 getreg(MANC), getreg(MDIC), getreg(SWSM), getreg(STATUS),
793 getreg(TORL), getreg(TOTL), getreg(IMS), getreg(TCTL),
794 getreg(RDH), getreg(RDT), getreg(VET), getreg(ICS),
795 getreg(TDBAL), getreg(TDBAH), getreg(RDBAH), getreg(RDBAL),
796 getreg(TDLEN), getreg(RDLEN),
798 [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8, [GPRC] = mac_read_clr4,
799 [GPTC] = mac_read_clr4, [TPR] = mac_read_clr4, [TPT] = mac_read_clr4,
800 [ICR] = mac_icr_read, [EECD] = get_eecd, [EERD] = flash_eerd_read,
801 [CRCERRS ... MPC] = &mac_readreg,
802 [RA ... RA+31] = &mac_readreg,
803 [MTA ... MTA+127] = &mac_readreg,
804 [VFTA ... VFTA+127] = &mac_readreg,
806 enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
808 #define putreg(x) [x] = mac_writereg
809 static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
810 putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC),
811 putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH),
812 putreg(RDBAL), putreg(LEDCTL), putreg(VET),
813 [TDLEN] = set_dlen, [RDLEN] = set_dlen, [TCTL] = set_tctl,
814 [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics,
815 [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt,
816 [IMC] = set_imc, [IMS] = set_ims, [ICR] = set_icr,
817 [EECD] = set_eecd, [RCTL] = set_rx_control, [CTRL] = set_ctrl,
818 [RA ... RA+31] = &mac_writereg,
819 [MTA ... MTA+127] = &mac_writereg,
820 [VFTA ... VFTA+127] = &mac_writereg,
822 enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
824 static void
825 e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
827 E1000State *s = opaque;
828 unsigned int index = (addr & 0x1ffff) >> 2;
830 #ifdef TARGET_WORDS_BIGENDIAN
831 val = bswap32(val);
832 #endif
833 if (index < NWRITEOPS && macreg_writeops[index])
834 macreg_writeops[index](s, index, val);
835 else if (index < NREADOPS && macreg_readops[index])
836 DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04x\n", index<<2, val);
837 else
838 DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
839 index<<2, val);
842 static void
843 e1000_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
845 // emulate hw without byte enables: no RMW
846 e1000_mmio_writel(opaque, addr & ~3,
847 (val & 0xffff) << (8*(addr & 3)));
850 static void
851 e1000_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
853 // emulate hw without byte enables: no RMW
854 e1000_mmio_writel(opaque, addr & ~3,
855 (val & 0xff) << (8*(addr & 3)));
858 static uint32_t
859 e1000_mmio_readl(void *opaque, target_phys_addr_t addr)
861 E1000State *s = opaque;
862 unsigned int index = (addr & 0x1ffff) >> 2;
864 if (index < NREADOPS && macreg_readops[index])
866 uint32_t val = macreg_readops[index](s, index);
867 #ifdef TARGET_WORDS_BIGENDIAN
868 val = bswap32(val);
869 #endif
870 return val;
872 DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
873 return 0;
876 static uint32_t
877 e1000_mmio_readb(void *opaque, target_phys_addr_t addr)
879 return ((e1000_mmio_readl(opaque, addr & ~3)) >>
880 (8 * (addr & 3))) & 0xff;
883 static uint32_t
884 e1000_mmio_readw(void *opaque, target_phys_addr_t addr)
886 return ((e1000_mmio_readl(opaque, addr & ~3)) >>
887 (8 * (addr & 3))) & 0xffff;
890 static bool is_version_1(void *opaque, int version_id)
892 return version_id == 1;
895 static const VMStateDescription vmstate_e1000 = {
896 .name = "e1000",
897 .version_id = 2,
898 .minimum_version_id = 1,
899 .minimum_version_id_old = 1,
900 .fields = (VMStateField []) {
901 VMSTATE_PCI_DEVICE(dev, E1000State),
902 VMSTATE_UNUSED_TEST(is_version_1, 4), /* was instance id */
903 VMSTATE_UNUSED(4), /* Was mmio_base. */
904 VMSTATE_UINT32(rxbuf_size, E1000State),
905 VMSTATE_UINT32(rxbuf_min_shift, E1000State),
906 VMSTATE_UINT32(eecd_state.val_in, E1000State),
907 VMSTATE_UINT16(eecd_state.bitnum_in, E1000State),
908 VMSTATE_UINT16(eecd_state.bitnum_out, E1000State),
909 VMSTATE_UINT16(eecd_state.reading, E1000State),
910 VMSTATE_UINT32(eecd_state.old_eecd, E1000State),
911 VMSTATE_UINT8(tx.ipcss, E1000State),
912 VMSTATE_UINT8(tx.ipcso, E1000State),
913 VMSTATE_UINT16(tx.ipcse, E1000State),
914 VMSTATE_UINT8(tx.tucss, E1000State),
915 VMSTATE_UINT8(tx.tucso, E1000State),
916 VMSTATE_UINT16(tx.tucse, E1000State),
917 VMSTATE_UINT32(tx.paylen, E1000State),
918 VMSTATE_UINT8(tx.hdr_len, E1000State),
919 VMSTATE_UINT16(tx.mss, E1000State),
920 VMSTATE_UINT16(tx.size, E1000State),
921 VMSTATE_UINT16(tx.tso_frames, E1000State),
922 VMSTATE_UINT8(tx.sum_needed, E1000State),
923 VMSTATE_INT8(tx.ip, E1000State),
924 VMSTATE_INT8(tx.tcp, E1000State),
925 VMSTATE_BUFFER(tx.header, E1000State),
926 VMSTATE_BUFFER(tx.data, E1000State),
927 VMSTATE_UINT16_ARRAY(eeprom_data, E1000State, 64),
928 VMSTATE_UINT16_ARRAY(phy_reg, E1000State, 0x20),
929 VMSTATE_UINT32(mac_reg[CTRL], E1000State),
930 VMSTATE_UINT32(mac_reg[EECD], E1000State),
931 VMSTATE_UINT32(mac_reg[EERD], E1000State),
932 VMSTATE_UINT32(mac_reg[GPRC], E1000State),
933 VMSTATE_UINT32(mac_reg[GPTC], E1000State),
934 VMSTATE_UINT32(mac_reg[ICR], E1000State),
935 VMSTATE_UINT32(mac_reg[ICS], E1000State),
936 VMSTATE_UINT32(mac_reg[IMC], E1000State),
937 VMSTATE_UINT32(mac_reg[IMS], E1000State),
938 VMSTATE_UINT32(mac_reg[LEDCTL], E1000State),
939 VMSTATE_UINT32(mac_reg[MANC], E1000State),
940 VMSTATE_UINT32(mac_reg[MDIC], E1000State),
941 VMSTATE_UINT32(mac_reg[MPC], E1000State),
942 VMSTATE_UINT32(mac_reg[PBA], E1000State),
943 VMSTATE_UINT32(mac_reg[RCTL], E1000State),
944 VMSTATE_UINT32(mac_reg[RDBAH], E1000State),
945 VMSTATE_UINT32(mac_reg[RDBAL], E1000State),
946 VMSTATE_UINT32(mac_reg[RDH], E1000State),
947 VMSTATE_UINT32(mac_reg[RDLEN], E1000State),
948 VMSTATE_UINT32(mac_reg[RDT], E1000State),
949 VMSTATE_UINT32(mac_reg[STATUS], E1000State),
950 VMSTATE_UINT32(mac_reg[SWSM], E1000State),
951 VMSTATE_UINT32(mac_reg[TCTL], E1000State),
952 VMSTATE_UINT32(mac_reg[TDBAH], E1000State),
953 VMSTATE_UINT32(mac_reg[TDBAL], E1000State),
954 VMSTATE_UINT32(mac_reg[TDH], E1000State),
955 VMSTATE_UINT32(mac_reg[TDLEN], E1000State),
956 VMSTATE_UINT32(mac_reg[TDT], E1000State),
957 VMSTATE_UINT32(mac_reg[TORH], E1000State),
958 VMSTATE_UINT32(mac_reg[TORL], E1000State),
959 VMSTATE_UINT32(mac_reg[TOTH], E1000State),
960 VMSTATE_UINT32(mac_reg[TOTL], E1000State),
961 VMSTATE_UINT32(mac_reg[TPR], E1000State),
962 VMSTATE_UINT32(mac_reg[TPT], E1000State),
963 VMSTATE_UINT32(mac_reg[TXDCTL], E1000State),
964 VMSTATE_UINT32(mac_reg[WUFC], E1000State),
965 VMSTATE_UINT32(mac_reg[VET], E1000State),
966 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, RA, 32),
967 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, 128),
968 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA, 128),
969 VMSTATE_END_OF_LIST()
973 static const uint16_t e1000_eeprom_template[64] = {
974 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
975 0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
976 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
977 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
978 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
979 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
980 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
981 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
984 static const uint16_t phy_reg_init[] = {
985 [PHY_CTRL] = 0x1140, [PHY_STATUS] = 0x796d, // link initially up
986 [PHY_ID1] = 0x141, [PHY_ID2] = PHY_ID2_INIT,
987 [PHY_1000T_CTRL] = 0x0e00, [M88E1000_PHY_SPEC_CTRL] = 0x360,
988 [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60, [PHY_AUTONEG_ADV] = 0xde1,
989 [PHY_LP_ABILITY] = 0x1e0, [PHY_1000T_STATUS] = 0x3c00,
990 [M88E1000_PHY_SPEC_STATUS] = 0xac00,
993 static const uint32_t mac_reg_init[] = {
994 [PBA] = 0x00100030,
995 [LEDCTL] = 0x602,
996 [CTRL] = E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
997 E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
998 [STATUS] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
999 E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
1000 E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
1001 E1000_STATUS_LU,
1002 [MANC] = E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
1003 E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
1004 E1000_MANC_RMCP_EN,
1007 /* PCI interface */
1009 static CPUWriteMemoryFunc * const e1000_mmio_write[] = {
1010 e1000_mmio_writeb, e1000_mmio_writew, e1000_mmio_writel
1013 static CPUReadMemoryFunc * const e1000_mmio_read[] = {
1014 e1000_mmio_readb, e1000_mmio_readw, e1000_mmio_readl
1017 static void
1018 e1000_mmio_map(PCIDevice *pci_dev, int region_num,
1019 pcibus_t addr, pcibus_t size, int type)
1021 E1000State *d = DO_UPCAST(E1000State, dev, pci_dev);
1022 int i;
1023 const uint32_t excluded_regs[] = {
1024 E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
1025 E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
1029 DBGOUT(MMIO, "e1000_mmio_map addr=0x%08"FMT_PCIBUS" 0x%08"FMT_PCIBUS"\n",
1030 addr, size);
1032 cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index);
1033 qemu_register_coalesced_mmio(addr, excluded_regs[0]);
1035 for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
1036 qemu_register_coalesced_mmio(addr + excluded_regs[i] + 4,
1037 excluded_regs[i + 1] -
1038 excluded_regs[i] - 4);
1041 static void
1042 e1000_cleanup(VLANClientState *nc)
1044 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
1046 s->nic = NULL;
1049 static int
1050 pci_e1000_uninit(PCIDevice *dev)
1052 E1000State *d = DO_UPCAST(E1000State, dev, dev);
1054 cpu_unregister_io_memory(d->mmio_index);
1055 qemu_del_vlan_client(&d->nic->nc);
1056 return 0;
1059 static void e1000_reset(void *opaque)
1061 E1000State *d = opaque;
1063 memset(d->phy_reg, 0, sizeof d->phy_reg);
1064 memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
1065 memset(d->mac_reg, 0, sizeof d->mac_reg);
1066 memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
1067 d->rxbuf_min_shift = 1;
1068 memset(&d->tx, 0, sizeof d->tx);
1071 static NetClientInfo net_e1000_info = {
1072 .type = NET_CLIENT_TYPE_NIC,
1073 .size = sizeof(NICState),
1074 .can_receive = e1000_can_receive,
1075 .receive = e1000_receive,
1076 .cleanup = e1000_cleanup,
1077 .link_status_changed = e1000_set_link_status,
1080 static int pci_e1000_init(PCIDevice *pci_dev)
1082 E1000State *d = DO_UPCAST(E1000State, dev, pci_dev);
1083 uint8_t *pci_conf;
1084 uint16_t checksum = 0;
1085 int i;
1086 uint8_t *macaddr;
1088 pci_conf = d->dev.config;
1090 pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1091 pci_config_set_device_id(pci_conf, E1000_DEVID);
1092 /* TODO: we have no capabilities, so why is this bit set? */
1093 pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_CAP_LIST);
1094 pci_conf[PCI_REVISION_ID] = 0x03;
1095 pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
1096 /* TODO: RST# value should be 0, PCI spec 6.2.4 */
1097 pci_conf[PCI_CACHE_LINE_SIZE] = 0x10;
1099 /* TODO: RST# value should be 0 if programmable, PCI spec 6.2.4 */
1100 pci_conf[PCI_INTERRUPT_PIN] = 1; // interrupt pin 0
1102 d->mmio_index = cpu_register_io_memory(e1000_mmio_read,
1103 e1000_mmio_write, d);
1105 pci_register_bar((PCIDevice *)d, 0, PNPMMIO_SIZE,
1106 PCI_BASE_ADDRESS_SPACE_MEMORY, e1000_mmio_map);
1108 pci_register_bar((PCIDevice *)d, 1, IOPORT_SIZE,
1109 PCI_BASE_ADDRESS_SPACE_IO, ioport_map);
1111 memmove(d->eeprom_data, e1000_eeprom_template,
1112 sizeof e1000_eeprom_template);
1113 qemu_macaddr_default_if_unset(&d->conf.macaddr);
1114 macaddr = d->conf.macaddr.a;
1115 for (i = 0; i < 3; i++)
1116 d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
1117 for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1118 checksum += d->eeprom_data[i];
1119 checksum = (uint16_t) EEPROM_SUM - checksum;
1120 d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
1122 d->nic = qemu_new_nic(&net_e1000_info, &d->conf,
1123 d->dev.qdev.info->name, d->dev.qdev.id, d);
1125 qemu_format_nic_info_str(&d->nic->nc, macaddr);
1126 return 0;
1129 static void qdev_e1000_reset(DeviceState *dev)
1131 E1000State *d = DO_UPCAST(E1000State, dev.qdev, dev);
1132 e1000_reset(d);
1135 static PCIDeviceInfo e1000_info = {
1136 .qdev.name = "e1000",
1137 .qdev.desc = "Intel Gigabit Ethernet",
1138 .qdev.size = sizeof(E1000State),
1139 .qdev.reset = qdev_e1000_reset,
1140 .qdev.vmsd = &vmstate_e1000,
1141 .init = pci_e1000_init,
1142 .exit = pci_e1000_uninit,
1143 .romfile = "pxe-e1000.bin",
1144 .qdev.props = (Property[]) {
1145 DEFINE_NIC_PROPERTIES(E1000State, conf),
1146 DEFINE_PROP_END_OF_LIST(),
1150 static void e1000_register_devices(void)
1152 pci_qdev_register(&e1000_info);
1155 device_init(e1000_register_devices)