target-m68k: Remove t1 from CPUM68KState
[qemu.git] / hw / e1000.c
blob5537ad2fc406446881caf1fa267b542d3e59bbfd
1 /*
2 * QEMU e1000 emulation
4 * Software developer's manual:
5 * http://download.intel.com/design/network/manuals/8254x_GBe_SDM.pdf
7 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
8 * Copyright (c) 2008 Qumranet
9 * Based on work done by:
10 * Copyright (c) 2007 Dan Aloni
11 * Copyright (c) 2004 Antony T Curtis
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2 of the License, or (at your option) any later version.
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
28 #include "hw.h"
29 #include "pci.h"
30 #include "net.h"
31 #include "net/checksum.h"
32 #include "loader.h"
33 #include "sysemu.h"
34 #include "dma.h"
36 #include "e1000_hw.h"
38 #define E1000_DEBUG
40 #ifdef E1000_DEBUG
41 enum {
42 DEBUG_GENERAL, DEBUG_IO, DEBUG_MMIO, DEBUG_INTERRUPT,
43 DEBUG_RX, DEBUG_TX, DEBUG_MDIC, DEBUG_EEPROM,
44 DEBUG_UNKNOWN, DEBUG_TXSUM, DEBUG_TXERR, DEBUG_RXERR,
45 DEBUG_RXFILTER, DEBUG_PHY, DEBUG_NOTYET,
47 #define DBGBIT(x) (1<<DEBUG_##x)
48 static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
50 #define DBGOUT(what, fmt, ...) do { \
51 if (debugflags & DBGBIT(what)) \
52 fprintf(stderr, "e1000: " fmt, ## __VA_ARGS__); \
53 } while (0)
54 #else
55 #define DBGOUT(what, fmt, ...) do {} while (0)
56 #endif
58 #define IOPORT_SIZE 0x40
59 #define PNPMMIO_SIZE 0x20000
60 #define MIN_BUF_SIZE 60 /* Min. octets in an ethernet frame sans FCS */
62 /* this is the size past which hardware will drop packets when setting LPE=0 */
63 #define MAXIMUM_ETHERNET_VLAN_SIZE 1522
66 * HW models:
67 * E1000_DEV_ID_82540EM works with Windows and Linux
68 * E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
69 * appears to perform better than 82540EM, but breaks with Linux 2.6.18
70 * E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
71 * Others never tested
73 enum { E1000_DEVID = E1000_DEV_ID_82540EM };
76 * May need to specify additional MAC-to-PHY entries --
77 * Intel's Windows driver refuses to initialize unless they match
79 enum {
80 PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ? 0xcc2 :
81 E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ? 0xc30 :
82 /* default to E1000_DEV_ID_82540EM */ 0xc20
85 typedef struct E1000State_st {
86 PCIDevice dev;
87 NICState *nic;
88 NICConf conf;
89 MemoryRegion mmio;
90 MemoryRegion io;
92 uint32_t mac_reg[0x8000];
93 uint16_t phy_reg[0x20];
94 uint16_t eeprom_data[64];
96 uint32_t rxbuf_size;
97 uint32_t rxbuf_min_shift;
98 struct e1000_tx {
99 unsigned char header[256];
100 unsigned char vlan_header[4];
101 /* Fields vlan and data must not be reordered or separated. */
102 unsigned char vlan[4];
103 unsigned char data[0x10000];
104 uint16_t size;
105 unsigned char sum_needed;
106 unsigned char vlan_needed;
107 uint8_t ipcss;
108 uint8_t ipcso;
109 uint16_t ipcse;
110 uint8_t tucss;
111 uint8_t tucso;
112 uint16_t tucse;
113 uint8_t hdr_len;
114 uint16_t mss;
115 uint32_t paylen;
116 uint16_t tso_frames;
117 char tse;
118 int8_t ip;
119 int8_t tcp;
120 char cptse; // current packet tse bit
121 } tx;
123 struct {
124 uint32_t val_in; // shifted in from guest driver
125 uint16_t bitnum_in;
126 uint16_t bitnum_out;
127 uint16_t reading;
128 uint32_t old_eecd;
129 } eecd_state;
131 QEMUTimer *autoneg_timer;
132 } E1000State;
134 #define defreg(x) x = (E1000_##x>>2)
135 enum {
136 defreg(CTRL), defreg(EECD), defreg(EERD), defreg(GPRC),
137 defreg(GPTC), defreg(ICR), defreg(ICS), defreg(IMC),
138 defreg(IMS), defreg(LEDCTL), defreg(MANC), defreg(MDIC),
139 defreg(MPC), defreg(PBA), defreg(RCTL), defreg(RDBAH),
140 defreg(RDBAL), defreg(RDH), defreg(RDLEN), defreg(RDT),
141 defreg(STATUS), defreg(SWSM), defreg(TCTL), defreg(TDBAH),
142 defreg(TDBAL), defreg(TDH), defreg(TDLEN), defreg(TDT),
143 defreg(TORH), defreg(TORL), defreg(TOTH), defreg(TOTL),
144 defreg(TPR), defreg(TPT), defreg(TXDCTL), defreg(WUFC),
145 defreg(RA), defreg(MTA), defreg(CRCERRS),defreg(VFTA),
146 defreg(VET),
149 static void
150 e1000_link_down(E1000State *s)
152 s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
153 s->phy_reg[PHY_STATUS] &= ~MII_SR_LINK_STATUS;
156 static void
157 e1000_link_up(E1000State *s)
159 s->mac_reg[STATUS] |= E1000_STATUS_LU;
160 s->phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS;
163 static void
164 set_phy_ctrl(E1000State *s, int index, uint16_t val)
166 if ((val & MII_CR_AUTO_NEG_EN) && (val & MII_CR_RESTART_AUTO_NEG)) {
167 s->nic->nc.link_down = true;
168 e1000_link_down(s);
169 s->phy_reg[PHY_STATUS] &= ~MII_SR_AUTONEG_COMPLETE;
170 DBGOUT(PHY, "Start link auto negotiation\n");
171 qemu_mod_timer(s->autoneg_timer, qemu_get_clock_ms(vm_clock) + 500);
175 static void
176 e1000_autoneg_timer(void *opaque)
178 E1000State *s = opaque;
179 s->nic->nc.link_down = false;
180 e1000_link_up(s);
181 s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
182 DBGOUT(PHY, "Auto negotiation is completed\n");
185 static void (*phyreg_writeops[])(E1000State *, int, uint16_t) = {
186 [PHY_CTRL] = set_phy_ctrl,
189 enum { NPHYWRITEOPS = ARRAY_SIZE(phyreg_writeops) };
191 enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
192 static const char phy_regcap[0x20] = {
193 [PHY_STATUS] = PHY_R, [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
194 [PHY_ID1] = PHY_R, [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
195 [PHY_CTRL] = PHY_RW, [PHY_1000T_CTRL] = PHY_RW,
196 [PHY_LP_ABILITY] = PHY_R, [PHY_1000T_STATUS] = PHY_R,
197 [PHY_AUTONEG_ADV] = PHY_RW, [M88E1000_RX_ERR_CNTR] = PHY_R,
198 [PHY_ID2] = PHY_R, [M88E1000_PHY_SPEC_STATUS] = PHY_R
201 static const uint16_t phy_reg_init[] = {
202 [PHY_CTRL] = 0x1140,
203 [PHY_STATUS] = 0x794d, /* link initially up with not completed autoneg */
204 [PHY_ID1] = 0x141, [PHY_ID2] = PHY_ID2_INIT,
205 [PHY_1000T_CTRL] = 0x0e00, [M88E1000_PHY_SPEC_CTRL] = 0x360,
206 [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60, [PHY_AUTONEG_ADV] = 0xde1,
207 [PHY_LP_ABILITY] = 0x1e0, [PHY_1000T_STATUS] = 0x3c00,
208 [M88E1000_PHY_SPEC_STATUS] = 0xac00,
211 static const uint32_t mac_reg_init[] = {
212 [PBA] = 0x00100030,
213 [LEDCTL] = 0x602,
214 [CTRL] = E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
215 E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
216 [STATUS] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
217 E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
218 E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
219 E1000_STATUS_LU,
220 [MANC] = E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
221 E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
222 E1000_MANC_RMCP_EN,
225 static void
226 set_interrupt_cause(E1000State *s, int index, uint32_t val)
228 if (val && (E1000_DEVID >= E1000_DEV_ID_82547EI_MOBILE)) {
229 /* Only for 8257x */
230 val |= E1000_ICR_INT_ASSERTED;
232 s->mac_reg[ICR] = val;
233 s->mac_reg[ICS] = val;
234 qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
237 static void
238 set_ics(E1000State *s, int index, uint32_t val)
240 DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
241 s->mac_reg[IMS]);
242 set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
245 static int
246 rxbufsize(uint32_t v)
248 v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
249 E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
250 E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
251 switch (v) {
252 case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
253 return 16384;
254 case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
255 return 8192;
256 case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
257 return 4096;
258 case E1000_RCTL_SZ_1024:
259 return 1024;
260 case E1000_RCTL_SZ_512:
261 return 512;
262 case E1000_RCTL_SZ_256:
263 return 256;
265 return 2048;
268 static void e1000_reset(void *opaque)
270 E1000State *d = opaque;
271 uint8_t *macaddr = d->conf.macaddr.a;
272 int i;
274 qemu_del_timer(d->autoneg_timer);
275 memset(d->phy_reg, 0, sizeof d->phy_reg);
276 memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
277 memset(d->mac_reg, 0, sizeof d->mac_reg);
278 memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
279 d->rxbuf_min_shift = 1;
280 memset(&d->tx, 0, sizeof d->tx);
282 if (d->nic->nc.link_down) {
283 e1000_link_down(d);
286 /* Some guests expect pre-initialized RAH/RAL (AddrValid flag + MACaddr) */
287 d->mac_reg[RA] = 0;
288 d->mac_reg[RA + 1] = E1000_RAH_AV;
289 for (i = 0; i < 4; i++) {
290 d->mac_reg[RA] |= macaddr[i] << (8 * i);
291 d->mac_reg[RA + 1] |= (i < 2) ? macaddr[i + 4] << (8 * i) : 0;
295 static void
296 set_ctrl(E1000State *s, int index, uint32_t val)
298 /* RST is self clearing */
299 s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
302 static void
303 set_rx_control(E1000State *s, int index, uint32_t val)
305 s->mac_reg[RCTL] = val;
306 s->rxbuf_size = rxbufsize(val);
307 s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
308 DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
309 s->mac_reg[RCTL]);
310 qemu_flush_queued_packets(&s->nic->nc);
313 static void
314 set_mdic(E1000State *s, int index, uint32_t val)
316 uint32_t data = val & E1000_MDIC_DATA_MASK;
317 uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
319 if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
320 val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
321 else if (val & E1000_MDIC_OP_READ) {
322 DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
323 if (!(phy_regcap[addr] & PHY_R)) {
324 DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
325 val |= E1000_MDIC_ERROR;
326 } else
327 val = (val ^ data) | s->phy_reg[addr];
328 } else if (val & E1000_MDIC_OP_WRITE) {
329 DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
330 if (!(phy_regcap[addr] & PHY_W)) {
331 DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
332 val |= E1000_MDIC_ERROR;
333 } else {
334 if (addr < NPHYWRITEOPS && phyreg_writeops[addr]) {
335 phyreg_writeops[addr](s, index, data);
337 s->phy_reg[addr] = data;
340 s->mac_reg[MDIC] = val | E1000_MDIC_READY;
342 if (val & E1000_MDIC_INT_EN) {
343 set_ics(s, 0, E1000_ICR_MDAC);
347 static uint32_t
348 get_eecd(E1000State *s, int index)
350 uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
352 DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
353 s->eecd_state.bitnum_out, s->eecd_state.reading);
354 if (!s->eecd_state.reading ||
355 ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
356 ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
357 ret |= E1000_EECD_DO;
358 return ret;
361 static void
362 set_eecd(E1000State *s, int index, uint32_t val)
364 uint32_t oldval = s->eecd_state.old_eecd;
366 s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
367 E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
368 if (!(E1000_EECD_CS & val)) // CS inactive; nothing to do
369 return;
370 if (E1000_EECD_CS & (val ^ oldval)) { // CS rise edge; reset state
371 s->eecd_state.val_in = 0;
372 s->eecd_state.bitnum_in = 0;
373 s->eecd_state.bitnum_out = 0;
374 s->eecd_state.reading = 0;
376 if (!(E1000_EECD_SK & (val ^ oldval))) // no clock edge
377 return;
378 if (!(E1000_EECD_SK & val)) { // falling edge
379 s->eecd_state.bitnum_out++;
380 return;
382 s->eecd_state.val_in <<= 1;
383 if (val & E1000_EECD_DI)
384 s->eecd_state.val_in |= 1;
385 if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
386 s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
387 s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
388 EEPROM_READ_OPCODE_MICROWIRE);
390 DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
391 s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
392 s->eecd_state.reading);
395 static uint32_t
396 flash_eerd_read(E1000State *s, int x)
398 unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
400 if ((s->mac_reg[EERD] & E1000_EEPROM_RW_REG_START) == 0)
401 return (s->mac_reg[EERD]);
403 if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
404 return (E1000_EEPROM_RW_REG_DONE | r);
406 return ((s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
407 E1000_EEPROM_RW_REG_DONE | r);
410 static void
411 putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
413 uint32_t sum;
415 if (cse && cse < n)
416 n = cse + 1;
417 if (sloc < n-1) {
418 sum = net_checksum_add(n-css, data+css);
419 cpu_to_be16wu((uint16_t *)(data + sloc),
420 net_checksum_finish(sum));
424 static inline int
425 vlan_enabled(E1000State *s)
427 return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
430 static inline int
431 vlan_rx_filter_enabled(E1000State *s)
433 return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
436 static inline int
437 is_vlan_packet(E1000State *s, const uint8_t *buf)
439 return (be16_to_cpup((uint16_t *)(buf + 12)) ==
440 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
443 static inline int
444 is_vlan_txd(uint32_t txd_lower)
446 return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
449 /* FCS aka Ethernet CRC-32. We don't get it from backends and can't
450 * fill it in, just pad descriptor length by 4 bytes unless guest
451 * told us to strip it off the packet. */
452 static inline int
453 fcs_len(E1000State *s)
455 return (s->mac_reg[RCTL] & E1000_RCTL_SECRC) ? 0 : 4;
458 static void
459 e1000_send_packet(E1000State *s, const uint8_t *buf, int size)
461 if (s->phy_reg[PHY_CTRL] & MII_CR_LOOPBACK) {
462 s->nic->nc.info->receive(&s->nic->nc, buf, size);
463 } else {
464 qemu_send_packet(&s->nic->nc, buf, size);
468 static void
469 xmit_seg(E1000State *s)
471 uint16_t len, *sp;
472 unsigned int frames = s->tx.tso_frames, css, sofar, n;
473 struct e1000_tx *tp = &s->tx;
475 if (tp->tse && tp->cptse) {
476 css = tp->ipcss;
477 DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
478 frames, tp->size, css);
479 if (tp->ip) { // IPv4
480 cpu_to_be16wu((uint16_t *)(tp->data+css+2),
481 tp->size - css);
482 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
483 be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
484 } else // IPv6
485 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
486 tp->size - css);
487 css = tp->tucss;
488 len = tp->size - css;
489 DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
490 if (tp->tcp) {
491 sofar = frames * tp->mss;
492 cpu_to_be32wu((uint32_t *)(tp->data+css+4), // seq
493 be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
494 if (tp->paylen - sofar > tp->mss)
495 tp->data[css + 13] &= ~9; // PSH, FIN
496 } else // UDP
497 cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
498 if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
499 unsigned int phsum;
500 // add pseudo-header length before checksum calculation
501 sp = (uint16_t *)(tp->data + tp->tucso);
502 phsum = be16_to_cpup(sp) + len;
503 phsum = (phsum >> 16) + (phsum & 0xffff);
504 cpu_to_be16wu(sp, phsum);
506 tp->tso_frames++;
509 if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
510 putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
511 if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
512 putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
513 if (tp->vlan_needed) {
514 memmove(tp->vlan, tp->data, 4);
515 memmove(tp->data, tp->data + 4, 8);
516 memcpy(tp->data + 8, tp->vlan_header, 4);
517 e1000_send_packet(s, tp->vlan, tp->size + 4);
518 } else
519 e1000_send_packet(s, tp->data, tp->size);
520 s->mac_reg[TPT]++;
521 s->mac_reg[GPTC]++;
522 n = s->mac_reg[TOTL];
523 if ((s->mac_reg[TOTL] += s->tx.size) < n)
524 s->mac_reg[TOTH]++;
527 static void
528 process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
530 uint32_t txd_lower = le32_to_cpu(dp->lower.data);
531 uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
532 unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
533 unsigned int msh = 0xfffff, hdr = 0;
534 uint64_t addr;
535 struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
536 struct e1000_tx *tp = &s->tx;
538 if (dtype == E1000_TXD_CMD_DEXT) { // context descriptor
539 op = le32_to_cpu(xp->cmd_and_length);
540 tp->ipcss = xp->lower_setup.ip_fields.ipcss;
541 tp->ipcso = xp->lower_setup.ip_fields.ipcso;
542 tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
543 tp->tucss = xp->upper_setup.tcp_fields.tucss;
544 tp->tucso = xp->upper_setup.tcp_fields.tucso;
545 tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
546 tp->paylen = op & 0xfffff;
547 tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
548 tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
549 tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
550 tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
551 tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
552 tp->tso_frames = 0;
553 if (tp->tucso == 0) { // this is probably wrong
554 DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
555 tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
557 return;
558 } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
559 // data descriptor
560 if (tp->size == 0) {
561 tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
563 tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
564 } else {
565 // legacy descriptor
566 tp->cptse = 0;
569 if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
570 (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
571 tp->vlan_needed = 1;
572 cpu_to_be16wu((uint16_t *)(tp->vlan_header),
573 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
574 cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
575 le16_to_cpu(dp->upper.fields.special));
578 addr = le64_to_cpu(dp->buffer_addr);
579 if (tp->tse && tp->cptse) {
580 hdr = tp->hdr_len;
581 msh = hdr + tp->mss;
582 do {
583 bytes = split_size;
584 if (tp->size + bytes > msh)
585 bytes = msh - tp->size;
587 bytes = MIN(sizeof(tp->data) - tp->size, bytes);
588 pci_dma_read(&s->dev, addr, tp->data + tp->size, bytes);
589 if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
590 memmove(tp->header, tp->data, hdr);
591 tp->size = sz;
592 addr += bytes;
593 if (sz == msh) {
594 xmit_seg(s);
595 memmove(tp->data, tp->header, hdr);
596 tp->size = hdr;
598 } while (split_size -= bytes);
599 } else if (!tp->tse && tp->cptse) {
600 // context descriptor TSE is not set, while data descriptor TSE is set
601 DBGOUT(TXERR, "TCP segmentation error\n");
602 } else {
603 split_size = MIN(sizeof(tp->data) - tp->size, split_size);
604 pci_dma_read(&s->dev, addr, tp->data + tp->size, split_size);
605 tp->size += split_size;
608 if (!(txd_lower & E1000_TXD_CMD_EOP))
609 return;
610 if (!(tp->tse && tp->cptse && tp->size < hdr))
611 xmit_seg(s);
612 tp->tso_frames = 0;
613 tp->sum_needed = 0;
614 tp->vlan_needed = 0;
615 tp->size = 0;
616 tp->cptse = 0;
619 static uint32_t
620 txdesc_writeback(E1000State *s, dma_addr_t base, struct e1000_tx_desc *dp)
622 uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
624 if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
625 return 0;
626 txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
627 ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
628 dp->upper.data = cpu_to_le32(txd_upper);
629 pci_dma_write(&s->dev, base + ((char *)&dp->upper - (char *)dp),
630 &dp->upper, sizeof(dp->upper));
631 return E1000_ICR_TXDW;
634 static uint64_t tx_desc_base(E1000State *s)
636 uint64_t bah = s->mac_reg[TDBAH];
637 uint64_t bal = s->mac_reg[TDBAL] & ~0xf;
639 return (bah << 32) + bal;
642 static void
643 start_xmit(E1000State *s)
645 dma_addr_t base;
646 struct e1000_tx_desc desc;
647 uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
649 if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
650 DBGOUT(TX, "tx disabled\n");
651 return;
654 while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
655 base = tx_desc_base(s) +
656 sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
657 pci_dma_read(&s->dev, base, &desc, sizeof(desc));
659 DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
660 (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
661 desc.upper.data);
663 process_tx_desc(s, &desc);
664 cause |= txdesc_writeback(s, base, &desc);
666 if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
667 s->mac_reg[TDH] = 0;
669 * the following could happen only if guest sw assigns
670 * bogus values to TDT/TDLEN.
671 * there's nothing too intelligent we could do about this.
673 if (s->mac_reg[TDH] == tdh_start) {
674 DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
675 tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
676 break;
679 set_ics(s, 0, cause);
682 static int
683 receive_filter(E1000State *s, const uint8_t *buf, int size)
685 static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
686 static const int mta_shift[] = {4, 3, 2, 0};
687 uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
689 if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
690 uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
691 uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
692 ((vid >> 5) & 0x7f));
693 if ((vfta & (1 << (vid & 0x1f))) == 0)
694 return 0;
697 if (rctl & E1000_RCTL_UPE) // promiscuous
698 return 1;
700 if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE)) // promiscuous mcast
701 return 1;
703 if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
704 return 1;
706 for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
707 if (!(rp[1] & E1000_RAH_AV))
708 continue;
709 ra[0] = cpu_to_le32(rp[0]);
710 ra[1] = cpu_to_le32(rp[1]);
711 if (!memcmp(buf, (uint8_t *)ra, 6)) {
712 DBGOUT(RXFILTER,
713 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
714 (int)(rp - s->mac_reg - RA)/2,
715 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
716 return 1;
719 DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
720 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
722 f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
723 f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
724 if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
725 return 1;
726 DBGOUT(RXFILTER,
727 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
728 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
729 (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
730 s->mac_reg[MTA + (f >> 5)]);
732 return 0;
735 static void
736 e1000_set_link_status(NetClientState *nc)
738 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
739 uint32_t old_status = s->mac_reg[STATUS];
741 if (nc->link_down) {
742 e1000_link_down(s);
743 } else {
744 e1000_link_up(s);
747 if (s->mac_reg[STATUS] != old_status)
748 set_ics(s, 0, E1000_ICR_LSC);
751 static bool e1000_has_rxbufs(E1000State *s, size_t total_size)
753 int bufs;
754 /* Fast-path short packets */
755 if (total_size <= s->rxbuf_size) {
756 return s->mac_reg[RDH] != s->mac_reg[RDT];
758 if (s->mac_reg[RDH] < s->mac_reg[RDT]) {
759 bufs = s->mac_reg[RDT] - s->mac_reg[RDH];
760 } else if (s->mac_reg[RDH] > s->mac_reg[RDT]) {
761 bufs = s->mac_reg[RDLEN] / sizeof(struct e1000_rx_desc) +
762 s->mac_reg[RDT] - s->mac_reg[RDH];
763 } else {
764 return false;
766 return total_size <= bufs * s->rxbuf_size;
769 static int
770 e1000_can_receive(NetClientState *nc)
772 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
774 return (s->mac_reg[RCTL] & E1000_RCTL_EN) && e1000_has_rxbufs(s, 1);
777 static uint64_t rx_desc_base(E1000State *s)
779 uint64_t bah = s->mac_reg[RDBAH];
780 uint64_t bal = s->mac_reg[RDBAL] & ~0xf;
782 return (bah << 32) + bal;
785 static ssize_t
786 e1000_receive(NetClientState *nc, const uint8_t *buf, size_t size)
788 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
789 struct e1000_rx_desc desc;
790 dma_addr_t base;
791 unsigned int n, rdt;
792 uint32_t rdh_start;
793 uint16_t vlan_special = 0;
794 uint8_t vlan_status = 0, vlan_offset = 0;
795 uint8_t min_buf[MIN_BUF_SIZE];
796 size_t desc_offset;
797 size_t desc_size;
798 size_t total_size;
800 if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
801 return -1;
803 /* Pad to minimum Ethernet frame length */
804 if (size < sizeof(min_buf)) {
805 memcpy(min_buf, buf, size);
806 memset(&min_buf[size], 0, sizeof(min_buf) - size);
807 buf = min_buf;
808 size = sizeof(min_buf);
811 /* Discard oversized packets if !LPE and !SBP. */
812 if (size > MAXIMUM_ETHERNET_VLAN_SIZE
813 && !(s->mac_reg[RCTL] & E1000_RCTL_LPE)
814 && !(s->mac_reg[RCTL] & E1000_RCTL_SBP)) {
815 return size;
818 if (!receive_filter(s, buf, size))
819 return size;
821 if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
822 vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
823 memmove((uint8_t *)buf + 4, buf, 12);
824 vlan_status = E1000_RXD_STAT_VP;
825 vlan_offset = 4;
826 size -= 4;
829 rdh_start = s->mac_reg[RDH];
830 desc_offset = 0;
831 total_size = size + fcs_len(s);
832 if (!e1000_has_rxbufs(s, total_size)) {
833 set_ics(s, 0, E1000_ICS_RXO);
834 return -1;
836 do {
837 desc_size = total_size - desc_offset;
838 if (desc_size > s->rxbuf_size) {
839 desc_size = s->rxbuf_size;
841 base = rx_desc_base(s) + sizeof(desc) * s->mac_reg[RDH];
842 pci_dma_read(&s->dev, base, &desc, sizeof(desc));
843 desc.special = vlan_special;
844 desc.status |= (vlan_status | E1000_RXD_STAT_DD);
845 if (desc.buffer_addr) {
846 if (desc_offset < size) {
847 size_t copy_size = size - desc_offset;
848 if (copy_size > s->rxbuf_size) {
849 copy_size = s->rxbuf_size;
851 pci_dma_write(&s->dev, le64_to_cpu(desc.buffer_addr),
852 buf + desc_offset + vlan_offset, copy_size);
854 desc_offset += desc_size;
855 desc.length = cpu_to_le16(desc_size);
856 if (desc_offset >= total_size) {
857 desc.status |= E1000_RXD_STAT_EOP | E1000_RXD_STAT_IXSM;
858 } else {
859 /* Guest zeroing out status is not a hardware requirement.
860 Clear EOP in case guest didn't do it. */
861 desc.status &= ~E1000_RXD_STAT_EOP;
863 } else { // as per intel docs; skip descriptors with null buf addr
864 DBGOUT(RX, "Null RX descriptor!!\n");
866 pci_dma_write(&s->dev, base, &desc, sizeof(desc));
868 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
869 s->mac_reg[RDH] = 0;
870 /* see comment in start_xmit; same here */
871 if (s->mac_reg[RDH] == rdh_start) {
872 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
873 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
874 set_ics(s, 0, E1000_ICS_RXO);
875 return -1;
877 } while (desc_offset < total_size);
879 s->mac_reg[GPRC]++;
880 s->mac_reg[TPR]++;
881 /* TOR - Total Octets Received:
882 * This register includes bytes received in a packet from the <Destination
883 * Address> field through the <CRC> field, inclusively.
885 n = s->mac_reg[TORL] + size + /* Always include FCS length. */ 4;
886 if (n < s->mac_reg[TORL])
887 s->mac_reg[TORH]++;
888 s->mac_reg[TORL] = n;
890 n = E1000_ICS_RXT0;
891 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
892 rdt += s->mac_reg[RDLEN] / sizeof(desc);
893 if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
894 s->rxbuf_min_shift)
895 n |= E1000_ICS_RXDMT0;
897 set_ics(s, 0, n);
899 return size;
902 static uint32_t
903 mac_readreg(E1000State *s, int index)
905 return s->mac_reg[index];
908 static uint32_t
909 mac_icr_read(E1000State *s, int index)
911 uint32_t ret = s->mac_reg[ICR];
913 DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
914 set_interrupt_cause(s, 0, 0);
915 return ret;
918 static uint32_t
919 mac_read_clr4(E1000State *s, int index)
921 uint32_t ret = s->mac_reg[index];
923 s->mac_reg[index] = 0;
924 return ret;
927 static uint32_t
928 mac_read_clr8(E1000State *s, int index)
930 uint32_t ret = s->mac_reg[index];
932 s->mac_reg[index] = 0;
933 s->mac_reg[index-1] = 0;
934 return ret;
937 static void
938 mac_writereg(E1000State *s, int index, uint32_t val)
940 s->mac_reg[index] = val;
943 static void
944 set_rdt(E1000State *s, int index, uint32_t val)
946 s->mac_reg[index] = val & 0xffff;
947 if (e1000_has_rxbufs(s, 1)) {
948 qemu_flush_queued_packets(&s->nic->nc);
952 static void
953 set_16bit(E1000State *s, int index, uint32_t val)
955 s->mac_reg[index] = val & 0xffff;
958 static void
959 set_dlen(E1000State *s, int index, uint32_t val)
961 s->mac_reg[index] = val & 0xfff80;
964 static void
965 set_tctl(E1000State *s, int index, uint32_t val)
967 s->mac_reg[index] = val;
968 s->mac_reg[TDT] &= 0xffff;
969 start_xmit(s);
972 static void
973 set_icr(E1000State *s, int index, uint32_t val)
975 DBGOUT(INTERRUPT, "set_icr %x\n", val);
976 set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
979 static void
980 set_imc(E1000State *s, int index, uint32_t val)
982 s->mac_reg[IMS] &= ~val;
983 set_ics(s, 0, 0);
986 static void
987 set_ims(E1000State *s, int index, uint32_t val)
989 s->mac_reg[IMS] |= val;
990 set_ics(s, 0, 0);
993 #define getreg(x) [x] = mac_readreg
994 static uint32_t (*macreg_readops[])(E1000State *, int) = {
995 getreg(PBA), getreg(RCTL), getreg(TDH), getreg(TXDCTL),
996 getreg(WUFC), getreg(TDT), getreg(CTRL), getreg(LEDCTL),
997 getreg(MANC), getreg(MDIC), getreg(SWSM), getreg(STATUS),
998 getreg(TORL), getreg(TOTL), getreg(IMS), getreg(TCTL),
999 getreg(RDH), getreg(RDT), getreg(VET), getreg(ICS),
1000 getreg(TDBAL), getreg(TDBAH), getreg(RDBAH), getreg(RDBAL),
1001 getreg(TDLEN), getreg(RDLEN),
1003 [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8, [GPRC] = mac_read_clr4,
1004 [GPTC] = mac_read_clr4, [TPR] = mac_read_clr4, [TPT] = mac_read_clr4,
1005 [ICR] = mac_icr_read, [EECD] = get_eecd, [EERD] = flash_eerd_read,
1006 [CRCERRS ... MPC] = &mac_readreg,
1007 [RA ... RA+31] = &mac_readreg,
1008 [MTA ... MTA+127] = &mac_readreg,
1009 [VFTA ... VFTA+127] = &mac_readreg,
1011 enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
1013 #define putreg(x) [x] = mac_writereg
1014 static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
1015 putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC),
1016 putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH),
1017 putreg(RDBAL), putreg(LEDCTL), putreg(VET),
1018 [TDLEN] = set_dlen, [RDLEN] = set_dlen, [TCTL] = set_tctl,
1019 [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics,
1020 [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt,
1021 [IMC] = set_imc, [IMS] = set_ims, [ICR] = set_icr,
1022 [EECD] = set_eecd, [RCTL] = set_rx_control, [CTRL] = set_ctrl,
1023 [RA ... RA+31] = &mac_writereg,
1024 [MTA ... MTA+127] = &mac_writereg,
1025 [VFTA ... VFTA+127] = &mac_writereg,
1028 enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
1030 static void
1031 e1000_mmio_write(void *opaque, hwaddr addr, uint64_t val,
1032 unsigned size)
1034 E1000State *s = opaque;
1035 unsigned int index = (addr & 0x1ffff) >> 2;
1037 if (index < NWRITEOPS && macreg_writeops[index]) {
1038 macreg_writeops[index](s, index, val);
1039 } else if (index < NREADOPS && macreg_readops[index]) {
1040 DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04"PRIx64"\n", index<<2, val);
1041 } else {
1042 DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08"PRIx64"\n",
1043 index<<2, val);
1047 static uint64_t
1048 e1000_mmio_read(void *opaque, hwaddr addr, unsigned size)
1050 E1000State *s = opaque;
1051 unsigned int index = (addr & 0x1ffff) >> 2;
1053 if (index < NREADOPS && macreg_readops[index])
1055 return macreg_readops[index](s, index);
1057 DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
1058 return 0;
1061 static const MemoryRegionOps e1000_mmio_ops = {
1062 .read = e1000_mmio_read,
1063 .write = e1000_mmio_write,
1064 .endianness = DEVICE_LITTLE_ENDIAN,
1065 .impl = {
1066 .min_access_size = 4,
1067 .max_access_size = 4,
1071 static uint64_t e1000_io_read(void *opaque, hwaddr addr,
1072 unsigned size)
1074 E1000State *s = opaque;
1076 (void)s;
1077 return 0;
1080 static void e1000_io_write(void *opaque, hwaddr addr,
1081 uint64_t val, unsigned size)
1083 E1000State *s = opaque;
1085 (void)s;
1088 static const MemoryRegionOps e1000_io_ops = {
1089 .read = e1000_io_read,
1090 .write = e1000_io_write,
1091 .endianness = DEVICE_LITTLE_ENDIAN,
1094 static bool is_version_1(void *opaque, int version_id)
1096 return version_id == 1;
1099 static int e1000_post_load(void *opaque, int version_id)
1101 E1000State *s = opaque;
1103 /* nc.link_down can't be migrated, so infer link_down according
1104 * to link status bit in mac_reg[STATUS] */
1105 s->nic->nc.link_down = (s->mac_reg[STATUS] & E1000_STATUS_LU) == 0;
1107 return 0;
1110 static const VMStateDescription vmstate_e1000 = {
1111 .name = "e1000",
1112 .version_id = 2,
1113 .minimum_version_id = 1,
1114 .minimum_version_id_old = 1,
1115 .post_load = e1000_post_load,
1116 .fields = (VMStateField []) {
1117 VMSTATE_PCI_DEVICE(dev, E1000State),
1118 VMSTATE_UNUSED_TEST(is_version_1, 4), /* was instance id */
1119 VMSTATE_UNUSED(4), /* Was mmio_base. */
1120 VMSTATE_UINT32(rxbuf_size, E1000State),
1121 VMSTATE_UINT32(rxbuf_min_shift, E1000State),
1122 VMSTATE_UINT32(eecd_state.val_in, E1000State),
1123 VMSTATE_UINT16(eecd_state.bitnum_in, E1000State),
1124 VMSTATE_UINT16(eecd_state.bitnum_out, E1000State),
1125 VMSTATE_UINT16(eecd_state.reading, E1000State),
1126 VMSTATE_UINT32(eecd_state.old_eecd, E1000State),
1127 VMSTATE_UINT8(tx.ipcss, E1000State),
1128 VMSTATE_UINT8(tx.ipcso, E1000State),
1129 VMSTATE_UINT16(tx.ipcse, E1000State),
1130 VMSTATE_UINT8(tx.tucss, E1000State),
1131 VMSTATE_UINT8(tx.tucso, E1000State),
1132 VMSTATE_UINT16(tx.tucse, E1000State),
1133 VMSTATE_UINT32(tx.paylen, E1000State),
1134 VMSTATE_UINT8(tx.hdr_len, E1000State),
1135 VMSTATE_UINT16(tx.mss, E1000State),
1136 VMSTATE_UINT16(tx.size, E1000State),
1137 VMSTATE_UINT16(tx.tso_frames, E1000State),
1138 VMSTATE_UINT8(tx.sum_needed, E1000State),
1139 VMSTATE_INT8(tx.ip, E1000State),
1140 VMSTATE_INT8(tx.tcp, E1000State),
1141 VMSTATE_BUFFER(tx.header, E1000State),
1142 VMSTATE_BUFFER(tx.data, E1000State),
1143 VMSTATE_UINT16_ARRAY(eeprom_data, E1000State, 64),
1144 VMSTATE_UINT16_ARRAY(phy_reg, E1000State, 0x20),
1145 VMSTATE_UINT32(mac_reg[CTRL], E1000State),
1146 VMSTATE_UINT32(mac_reg[EECD], E1000State),
1147 VMSTATE_UINT32(mac_reg[EERD], E1000State),
1148 VMSTATE_UINT32(mac_reg[GPRC], E1000State),
1149 VMSTATE_UINT32(mac_reg[GPTC], E1000State),
1150 VMSTATE_UINT32(mac_reg[ICR], E1000State),
1151 VMSTATE_UINT32(mac_reg[ICS], E1000State),
1152 VMSTATE_UINT32(mac_reg[IMC], E1000State),
1153 VMSTATE_UINT32(mac_reg[IMS], E1000State),
1154 VMSTATE_UINT32(mac_reg[LEDCTL], E1000State),
1155 VMSTATE_UINT32(mac_reg[MANC], E1000State),
1156 VMSTATE_UINT32(mac_reg[MDIC], E1000State),
1157 VMSTATE_UINT32(mac_reg[MPC], E1000State),
1158 VMSTATE_UINT32(mac_reg[PBA], E1000State),
1159 VMSTATE_UINT32(mac_reg[RCTL], E1000State),
1160 VMSTATE_UINT32(mac_reg[RDBAH], E1000State),
1161 VMSTATE_UINT32(mac_reg[RDBAL], E1000State),
1162 VMSTATE_UINT32(mac_reg[RDH], E1000State),
1163 VMSTATE_UINT32(mac_reg[RDLEN], E1000State),
1164 VMSTATE_UINT32(mac_reg[RDT], E1000State),
1165 VMSTATE_UINT32(mac_reg[STATUS], E1000State),
1166 VMSTATE_UINT32(mac_reg[SWSM], E1000State),
1167 VMSTATE_UINT32(mac_reg[TCTL], E1000State),
1168 VMSTATE_UINT32(mac_reg[TDBAH], E1000State),
1169 VMSTATE_UINT32(mac_reg[TDBAL], E1000State),
1170 VMSTATE_UINT32(mac_reg[TDH], E1000State),
1171 VMSTATE_UINT32(mac_reg[TDLEN], E1000State),
1172 VMSTATE_UINT32(mac_reg[TDT], E1000State),
1173 VMSTATE_UINT32(mac_reg[TORH], E1000State),
1174 VMSTATE_UINT32(mac_reg[TORL], E1000State),
1175 VMSTATE_UINT32(mac_reg[TOTH], E1000State),
1176 VMSTATE_UINT32(mac_reg[TOTL], E1000State),
1177 VMSTATE_UINT32(mac_reg[TPR], E1000State),
1178 VMSTATE_UINT32(mac_reg[TPT], E1000State),
1179 VMSTATE_UINT32(mac_reg[TXDCTL], E1000State),
1180 VMSTATE_UINT32(mac_reg[WUFC], E1000State),
1181 VMSTATE_UINT32(mac_reg[VET], E1000State),
1182 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, RA, 32),
1183 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, 128),
1184 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA, 128),
1185 VMSTATE_END_OF_LIST()
1189 static const uint16_t e1000_eeprom_template[64] = {
1190 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
1191 0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
1192 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
1193 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
1194 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
1195 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1196 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1197 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
1200 /* PCI interface */
1202 static void
1203 e1000_mmio_setup(E1000State *d)
1205 int i;
1206 const uint32_t excluded_regs[] = {
1207 E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
1208 E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
1211 memory_region_init_io(&d->mmio, &e1000_mmio_ops, d, "e1000-mmio",
1212 PNPMMIO_SIZE);
1213 memory_region_add_coalescing(&d->mmio, 0, excluded_regs[0]);
1214 for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
1215 memory_region_add_coalescing(&d->mmio, excluded_regs[i] + 4,
1216 excluded_regs[i+1] - excluded_regs[i] - 4);
1217 memory_region_init_io(&d->io, &e1000_io_ops, d, "e1000-io", IOPORT_SIZE);
1220 static void
1221 e1000_cleanup(NetClientState *nc)
1223 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
1225 s->nic = NULL;
1228 static void
1229 pci_e1000_uninit(PCIDevice *dev)
1231 E1000State *d = DO_UPCAST(E1000State, dev, dev);
1233 qemu_del_timer(d->autoneg_timer);
1234 qemu_free_timer(d->autoneg_timer);
1235 memory_region_destroy(&d->mmio);
1236 memory_region_destroy(&d->io);
1237 qemu_del_net_client(&d->nic->nc);
1240 static NetClientInfo net_e1000_info = {
1241 .type = NET_CLIENT_OPTIONS_KIND_NIC,
1242 .size = sizeof(NICState),
1243 .can_receive = e1000_can_receive,
1244 .receive = e1000_receive,
1245 .cleanup = e1000_cleanup,
1246 .link_status_changed = e1000_set_link_status,
1249 static int pci_e1000_init(PCIDevice *pci_dev)
1251 E1000State *d = DO_UPCAST(E1000State, dev, pci_dev);
1252 uint8_t *pci_conf;
1253 uint16_t checksum = 0;
1254 int i;
1255 uint8_t *macaddr;
1257 pci_conf = d->dev.config;
1259 /* TODO: RST# value should be 0, PCI spec 6.2.4 */
1260 pci_conf[PCI_CACHE_LINE_SIZE] = 0x10;
1262 pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
1264 e1000_mmio_setup(d);
1266 pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &d->mmio);
1268 pci_register_bar(&d->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &d->io);
1270 memmove(d->eeprom_data, e1000_eeprom_template,
1271 sizeof e1000_eeprom_template);
1272 qemu_macaddr_default_if_unset(&d->conf.macaddr);
1273 macaddr = d->conf.macaddr.a;
1274 for (i = 0; i < 3; i++)
1275 d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
1276 for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1277 checksum += d->eeprom_data[i];
1278 checksum = (uint16_t) EEPROM_SUM - checksum;
1279 d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
1281 d->nic = qemu_new_nic(&net_e1000_info, &d->conf,
1282 object_get_typename(OBJECT(d)), d->dev.qdev.id, d);
1284 qemu_format_nic_info_str(&d->nic->nc, macaddr);
1286 add_boot_device_path(d->conf.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
1288 d->autoneg_timer = qemu_new_timer_ms(vm_clock, e1000_autoneg_timer, d);
1290 return 0;
1293 static void qdev_e1000_reset(DeviceState *dev)
1295 E1000State *d = DO_UPCAST(E1000State, dev.qdev, dev);
1296 e1000_reset(d);
1299 static Property e1000_properties[] = {
1300 DEFINE_NIC_PROPERTIES(E1000State, conf),
1301 DEFINE_PROP_END_OF_LIST(),
1304 static void e1000_class_init(ObjectClass *klass, void *data)
1306 DeviceClass *dc = DEVICE_CLASS(klass);
1307 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1309 k->init = pci_e1000_init;
1310 k->exit = pci_e1000_uninit;
1311 k->romfile = "pxe-e1000.rom";
1312 k->vendor_id = PCI_VENDOR_ID_INTEL;
1313 k->device_id = E1000_DEVID;
1314 k->revision = 0x03;
1315 k->class_id = PCI_CLASS_NETWORK_ETHERNET;
1316 dc->desc = "Intel Gigabit Ethernet";
1317 dc->reset = qdev_e1000_reset;
1318 dc->vmsd = &vmstate_e1000;
1319 dc->props = e1000_properties;
1322 static TypeInfo e1000_info = {
1323 .name = "e1000",
1324 .parent = TYPE_PCI_DEVICE,
1325 .instance_size = sizeof(E1000State),
1326 .class_init = e1000_class_init,
1329 static void e1000_register_types(void)
1331 type_register_static(&e1000_info);
1334 type_init(e1000_register_types)