]> git.proxmox.com Git - mirror_qemu.git/blame - hw/e1000.c
Update version for 1.3.0-rc2
[mirror_qemu.git] / hw / e1000.c
CommitLineData
7c23b892
AZ
1/*
2 * QEMU e1000 emulation
3 *
2758aa52
MT
4 * Software developer's manual:
5 * http://download.intel.com/design/network/manuals/8254x_GBe_SDM.pdf
6 *
7c23b892
AZ
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
12 *
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.
17 *
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.
22 *
23 * You should have received a copy of the GNU Lesser General Public
8167ee88 24 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
7c23b892
AZ
25 */
26
27
28#include "hw.h"
29#include "pci.h"
30#include "net.h"
7200ac3c 31#include "net/checksum.h"
fbdaa002 32#include "loader.h"
1ca4d09a 33#include "sysemu.h"
62ecbd35 34#include "dma.h"
7c23b892 35
7c23b892
AZ
36#include "e1000_hw.h"
37
27124888 38#define E1000_DEBUG
7c23b892 39
27124888 40#ifdef E1000_DEBUG
7c23b892
AZ
41enum {
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,
f9c1cdf4 45 DEBUG_RXFILTER, DEBUG_PHY, DEBUG_NOTYET,
7c23b892
AZ
46};
47#define DBGBIT(x) (1<<DEBUG_##x)
48static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
49
6c7f4b47 50#define DBGOUT(what, fmt, ...) do { \
7c23b892 51 if (debugflags & DBGBIT(what)) \
6c7f4b47 52 fprintf(stderr, "e1000: " fmt, ## __VA_ARGS__); \
7c23b892
AZ
53 } while (0)
54#else
6c7f4b47 55#define DBGOUT(what, fmt, ...) do {} while (0)
7c23b892
AZ
56#endif
57
58#define IOPORT_SIZE 0x40
e94bbefe 59#define PNPMMIO_SIZE 0x20000
78aeb23e 60#define MIN_BUF_SIZE 60 /* Min. octets in an ethernet frame sans FCS */
7c23b892
AZ
61
62/*
63 * HW models:
64 * E1000_DEV_ID_82540EM works with Windows and Linux
65 * E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
66 * appears to perform better than 82540EM, but breaks with Linux 2.6.18
67 * E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
68 * Others never tested
69 */
70enum { E1000_DEVID = E1000_DEV_ID_82540EM };
71
72/*
73 * May need to specify additional MAC-to-PHY entries --
74 * Intel's Windows driver refuses to initialize unless they match
75 */
76enum {
77 PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ? 0xcc2 :
78 E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ? 0xc30 :
79 /* default to E1000_DEV_ID_82540EM */ 0xc20
80};
81
82typedef struct E1000State_st {
83 PCIDevice dev;
a03e2aec 84 NICState *nic;
fbdaa002 85 NICConf conf;
ad00a9b9
AK
86 MemoryRegion mmio;
87 MemoryRegion io;
7c23b892
AZ
88
89 uint32_t mac_reg[0x8000];
90 uint16_t phy_reg[0x20];
91 uint16_t eeprom_data[64];
92
93 uint32_t rxbuf_size;
94 uint32_t rxbuf_min_shift;
7c23b892
AZ
95 struct e1000_tx {
96 unsigned char header[256];
8f2e8d1f 97 unsigned char vlan_header[4];
b10fec9b 98 /* Fields vlan and data must not be reordered or separated. */
8f2e8d1f 99 unsigned char vlan[4];
7c23b892
AZ
100 unsigned char data[0x10000];
101 uint16_t size;
102 unsigned char sum_needed;
8f2e8d1f 103 unsigned char vlan_needed;
7c23b892
AZ
104 uint8_t ipcss;
105 uint8_t ipcso;
106 uint16_t ipcse;
107 uint8_t tucss;
108 uint8_t tucso;
109 uint16_t tucse;
110 uint8_t hdr_len;
111 uint16_t mss;
112 uint32_t paylen;
113 uint16_t tso_frames;
114 char tse;
b6c4f71f
BS
115 int8_t ip;
116 int8_t tcp;
1b0009db 117 char cptse; // current packet tse bit
7c23b892
AZ
118 } tx;
119
120 struct {
121 uint32_t val_in; // shifted in from guest driver
122 uint16_t bitnum_in;
123 uint16_t bitnum_out;
124 uint16_t reading;
125 uint32_t old_eecd;
126 } eecd_state;
b9d03e35
JW
127
128 QEMUTimer *autoneg_timer;
7c23b892
AZ
129} E1000State;
130
131#define defreg(x) x = (E1000_##x>>2)
132enum {
133 defreg(CTRL), defreg(EECD), defreg(EERD), defreg(GPRC),
134 defreg(GPTC), defreg(ICR), defreg(ICS), defreg(IMC),
135 defreg(IMS), defreg(LEDCTL), defreg(MANC), defreg(MDIC),
136 defreg(MPC), defreg(PBA), defreg(RCTL), defreg(RDBAH),
137 defreg(RDBAL), defreg(RDH), defreg(RDLEN), defreg(RDT),
138 defreg(STATUS), defreg(SWSM), defreg(TCTL), defreg(TDBAH),
139 defreg(TDBAL), defreg(TDH), defreg(TDLEN), defreg(TDT),
140 defreg(TORH), defreg(TORL), defreg(TOTH), defreg(TOTL),
141 defreg(TPR), defreg(TPT), defreg(TXDCTL), defreg(WUFC),
8f2e8d1f
AL
142 defreg(RA), defreg(MTA), defreg(CRCERRS),defreg(VFTA),
143 defreg(VET),
7c23b892
AZ
144};
145
71aadd3c
JW
146static void
147e1000_link_down(E1000State *s)
148{
149 s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
150 s->phy_reg[PHY_STATUS] &= ~MII_SR_LINK_STATUS;
151}
152
153static void
154e1000_link_up(E1000State *s)
155{
156 s->mac_reg[STATUS] |= E1000_STATUS_LU;
157 s->phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS;
158}
159
b9d03e35
JW
160static void
161set_phy_ctrl(E1000State *s, int index, uint16_t val)
162{
163 if ((val & MII_CR_AUTO_NEG_EN) && (val & MII_CR_RESTART_AUTO_NEG)) {
164 s->nic->nc.link_down = true;
165 e1000_link_down(s);
166 s->phy_reg[PHY_STATUS] &= ~MII_SR_AUTONEG_COMPLETE;
167 DBGOUT(PHY, "Start link auto negotiation\n");
168 qemu_mod_timer(s->autoneg_timer, qemu_get_clock_ms(vm_clock) + 500);
169 }
170}
171
172static void
173e1000_autoneg_timer(void *opaque)
174{
175 E1000State *s = opaque;
176 s->nic->nc.link_down = false;
177 e1000_link_up(s);
178 s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
179 DBGOUT(PHY, "Auto negotiation is completed\n");
180}
181
182static void (*phyreg_writeops[])(E1000State *, int, uint16_t) = {
183 [PHY_CTRL] = set_phy_ctrl,
184};
185
186enum { NPHYWRITEOPS = ARRAY_SIZE(phyreg_writeops) };
187
7c23b892 188enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
88b4e9db 189static const char phy_regcap[0x20] = {
7c23b892
AZ
190 [PHY_STATUS] = PHY_R, [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
191 [PHY_ID1] = PHY_R, [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
192 [PHY_CTRL] = PHY_RW, [PHY_1000T_CTRL] = PHY_RW,
193 [PHY_LP_ABILITY] = PHY_R, [PHY_1000T_STATUS] = PHY_R,
194 [PHY_AUTONEG_ADV] = PHY_RW, [M88E1000_RX_ERR_CNTR] = PHY_R,
700f6e2c 195 [PHY_ID2] = PHY_R, [M88E1000_PHY_SPEC_STATUS] = PHY_R
7c23b892
AZ
196};
197
814cd3ac 198static const uint16_t phy_reg_init[] = {
b9d03e35
JW
199 [PHY_CTRL] = 0x1140,
200 [PHY_STATUS] = 0x794d, /* link initially up with not completed autoneg */
814cd3ac
MT
201 [PHY_ID1] = 0x141, [PHY_ID2] = PHY_ID2_INIT,
202 [PHY_1000T_CTRL] = 0x0e00, [M88E1000_PHY_SPEC_CTRL] = 0x360,
203 [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60, [PHY_AUTONEG_ADV] = 0xde1,
204 [PHY_LP_ABILITY] = 0x1e0, [PHY_1000T_STATUS] = 0x3c00,
205 [M88E1000_PHY_SPEC_STATUS] = 0xac00,
206};
207
208static const uint32_t mac_reg_init[] = {
209 [PBA] = 0x00100030,
210 [LEDCTL] = 0x602,
211 [CTRL] = E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
212 E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
213 [STATUS] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
214 E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
215 E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
216 E1000_STATUS_LU,
217 [MANC] = E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
218 E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
219 E1000_MANC_RMCP_EN,
220};
221
7c23b892
AZ
222static void
223set_interrupt_cause(E1000State *s, int index, uint32_t val)
224{
f1219091
JW
225 if (val && (E1000_DEVID >= E1000_DEV_ID_82547EI_MOBILE)) {
226 /* Only for 8257x */
7c23b892 227 val |= E1000_ICR_INT_ASSERTED;
f1219091 228 }
7c23b892 229 s->mac_reg[ICR] = val;
b1332393 230 s->mac_reg[ICS] = val;
bc26e55a 231 qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
7c23b892
AZ
232}
233
234static void
235set_ics(E1000State *s, int index, uint32_t val)
236{
237 DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
238 s->mac_reg[IMS]);
239 set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
240}
241
242static int
243rxbufsize(uint32_t v)
244{
245 v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
246 E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
247 E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
248 switch (v) {
249 case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
250 return 16384;
251 case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
252 return 8192;
253 case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
254 return 4096;
255 case E1000_RCTL_SZ_1024:
256 return 1024;
257 case E1000_RCTL_SZ_512:
258 return 512;
259 case E1000_RCTL_SZ_256:
260 return 256;
261 }
262 return 2048;
263}
264
814cd3ac
MT
265static void e1000_reset(void *opaque)
266{
267 E1000State *d = opaque;
372254c6
GS
268 uint8_t *macaddr = d->conf.macaddr.a;
269 int i;
814cd3ac 270
b9d03e35 271 qemu_del_timer(d->autoneg_timer);
814cd3ac
MT
272 memset(d->phy_reg, 0, sizeof d->phy_reg);
273 memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
274 memset(d->mac_reg, 0, sizeof d->mac_reg);
275 memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
276 d->rxbuf_min_shift = 1;
277 memset(&d->tx, 0, sizeof d->tx);
278
279 if (d->nic->nc.link_down) {
71aadd3c 280 e1000_link_down(d);
814cd3ac 281 }
372254c6
GS
282
283 /* Some guests expect pre-initialized RAH/RAL (AddrValid flag + MACaddr) */
284 d->mac_reg[RA] = 0;
285 d->mac_reg[RA + 1] = E1000_RAH_AV;
286 for (i = 0; i < 4; i++) {
287 d->mac_reg[RA] |= macaddr[i] << (8 * i);
288 d->mac_reg[RA + 1] |= (i < 2) ? macaddr[i + 4] << (8 * i) : 0;
289 }
814cd3ac
MT
290}
291
cab3c825
KW
292static void
293set_ctrl(E1000State *s, int index, uint32_t val)
294{
295 /* RST is self clearing */
296 s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
297}
298
7c23b892
AZ
299static void
300set_rx_control(E1000State *s, int index, uint32_t val)
301{
302 s->mac_reg[RCTL] = val;
303 s->rxbuf_size = rxbufsize(val);
304 s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
305 DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
306 s->mac_reg[RCTL]);
e8b4c680 307 qemu_flush_queued_packets(&s->nic->nc);
7c23b892
AZ
308}
309
310static void
311set_mdic(E1000State *s, int index, uint32_t val)
312{
313 uint32_t data = val & E1000_MDIC_DATA_MASK;
314 uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
315
316 if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
317 val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
318 else if (val & E1000_MDIC_OP_READ) {
319 DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
320 if (!(phy_regcap[addr] & PHY_R)) {
321 DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
322 val |= E1000_MDIC_ERROR;
323 } else
324 val = (val ^ data) | s->phy_reg[addr];
325 } else if (val & E1000_MDIC_OP_WRITE) {
326 DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
327 if (!(phy_regcap[addr] & PHY_W)) {
328 DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
329 val |= E1000_MDIC_ERROR;
b9d03e35
JW
330 } else {
331 if (addr < NPHYWRITEOPS && phyreg_writeops[addr]) {
332 phyreg_writeops[addr](s, index, data);
333 }
7c23b892 334 s->phy_reg[addr] = data;
b9d03e35 335 }
7c23b892
AZ
336 }
337 s->mac_reg[MDIC] = val | E1000_MDIC_READY;
17fbbb0b
JW
338
339 if (val & E1000_MDIC_INT_EN) {
340 set_ics(s, 0, E1000_ICR_MDAC);
341 }
7c23b892
AZ
342}
343
344static uint32_t
345get_eecd(E1000State *s, int index)
346{
347 uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
348
349 DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
350 s->eecd_state.bitnum_out, s->eecd_state.reading);
351 if (!s->eecd_state.reading ||
352 ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
353 ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
354 ret |= E1000_EECD_DO;
355 return ret;
356}
357
358static void
359set_eecd(E1000State *s, int index, uint32_t val)
360{
361 uint32_t oldval = s->eecd_state.old_eecd;
362
363 s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
364 E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
9651ac55
IT
365 if (!(E1000_EECD_CS & val)) // CS inactive; nothing to do
366 return;
367 if (E1000_EECD_CS & (val ^ oldval)) { // CS rise edge; reset state
368 s->eecd_state.val_in = 0;
369 s->eecd_state.bitnum_in = 0;
370 s->eecd_state.bitnum_out = 0;
371 s->eecd_state.reading = 0;
372 }
7c23b892
AZ
373 if (!(E1000_EECD_SK & (val ^ oldval))) // no clock edge
374 return;
375 if (!(E1000_EECD_SK & val)) { // falling edge
376 s->eecd_state.bitnum_out++;
377 return;
378 }
7c23b892
AZ
379 s->eecd_state.val_in <<= 1;
380 if (val & E1000_EECD_DI)
381 s->eecd_state.val_in |= 1;
382 if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
383 s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
384 s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
385 EEPROM_READ_OPCODE_MICROWIRE);
386 }
387 DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
388 s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
389 s->eecd_state.reading);
390}
391
392static uint32_t
393flash_eerd_read(E1000State *s, int x)
394{
395 unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
396
b1332393
BP
397 if ((s->mac_reg[EERD] & E1000_EEPROM_RW_REG_START) == 0)
398 return (s->mac_reg[EERD]);
399
7c23b892 400 if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
b1332393
BP
401 return (E1000_EEPROM_RW_REG_DONE | r);
402
403 return ((s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
404 E1000_EEPROM_RW_REG_DONE | r);
7c23b892
AZ
405}
406
7c23b892
AZ
407static void
408putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
409{
c6a6a5e3
AL
410 uint32_t sum;
411
7c23b892
AZ
412 if (cse && cse < n)
413 n = cse + 1;
c6a6a5e3
AL
414 if (sloc < n-1) {
415 sum = net_checksum_add(n-css, data+css);
7c23b892 416 cpu_to_be16wu((uint16_t *)(data + sloc),
c6a6a5e3
AL
417 net_checksum_finish(sum));
418 }
7c23b892
AZ
419}
420
8f2e8d1f
AL
421static inline int
422vlan_enabled(E1000State *s)
423{
424 return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
425}
426
427static inline int
428vlan_rx_filter_enabled(E1000State *s)
429{
430 return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
431}
432
433static inline int
434is_vlan_packet(E1000State *s, const uint8_t *buf)
435{
436 return (be16_to_cpup((uint16_t *)(buf + 12)) ==
437 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
438}
439
440static inline int
441is_vlan_txd(uint32_t txd_lower)
442{
443 return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
444}
445
55e8d1ce
MT
446/* FCS aka Ethernet CRC-32. We don't get it from backends and can't
447 * fill it in, just pad descriptor length by 4 bytes unless guest
a05e8a6e 448 * told us to strip it off the packet. */
55e8d1ce
MT
449static inline int
450fcs_len(E1000State *s)
451{
452 return (s->mac_reg[RCTL] & E1000_RCTL_SECRC) ? 0 : 4;
453}
454
93e37d76
JW
455static void
456e1000_send_packet(E1000State *s, const uint8_t *buf, int size)
457{
458 if (s->phy_reg[PHY_CTRL] & MII_CR_LOOPBACK) {
459 s->nic->nc.info->receive(&s->nic->nc, buf, size);
460 } else {
461 qemu_send_packet(&s->nic->nc, buf, size);
462 }
463}
464
7c23b892
AZ
465static void
466xmit_seg(E1000State *s)
467{
468 uint16_t len, *sp;
469 unsigned int frames = s->tx.tso_frames, css, sofar, n;
470 struct e1000_tx *tp = &s->tx;
471
1b0009db 472 if (tp->tse && tp->cptse) {
7c23b892
AZ
473 css = tp->ipcss;
474 DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
475 frames, tp->size, css);
476 if (tp->ip) { // IPv4
477 cpu_to_be16wu((uint16_t *)(tp->data+css+2),
478 tp->size - css);
479 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
480 be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
481 } else // IPv6
482 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
483 tp->size - css);
484 css = tp->tucss;
485 len = tp->size - css;
486 DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
487 if (tp->tcp) {
488 sofar = frames * tp->mss;
489 cpu_to_be32wu((uint32_t *)(tp->data+css+4), // seq
88738c09 490 be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
7c23b892
AZ
491 if (tp->paylen - sofar > tp->mss)
492 tp->data[css + 13] &= ~9; // PSH, FIN
493 } else // UDP
494 cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
495 if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
e685b4eb 496 unsigned int phsum;
7c23b892
AZ
497 // add pseudo-header length before checksum calculation
498 sp = (uint16_t *)(tp->data + tp->tucso);
e685b4eb
AW
499 phsum = be16_to_cpup(sp) + len;
500 phsum = (phsum >> 16) + (phsum & 0xffff);
501 cpu_to_be16wu(sp, phsum);
7c23b892
AZ
502 }
503 tp->tso_frames++;
504 }
505
506 if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
507 putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
508 if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
509 putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
8f2e8d1f 510 if (tp->vlan_needed) {
b10fec9b
SW
511 memmove(tp->vlan, tp->data, 4);
512 memmove(tp->data, tp->data + 4, 8);
8f2e8d1f 513 memcpy(tp->data + 8, tp->vlan_header, 4);
93e37d76 514 e1000_send_packet(s, tp->vlan, tp->size + 4);
8f2e8d1f 515 } else
93e37d76 516 e1000_send_packet(s, tp->data, tp->size);
7c23b892
AZ
517 s->mac_reg[TPT]++;
518 s->mac_reg[GPTC]++;
519 n = s->mac_reg[TOTL];
520 if ((s->mac_reg[TOTL] += s->tx.size) < n)
521 s->mac_reg[TOTH]++;
522}
523
524static void
525process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
526{
527 uint32_t txd_lower = le32_to_cpu(dp->lower.data);
528 uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
529 unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
530 unsigned int msh = 0xfffff, hdr = 0;
531 uint64_t addr;
532 struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
533 struct e1000_tx *tp = &s->tx;
534
535 if (dtype == E1000_TXD_CMD_DEXT) { // context descriptor
536 op = le32_to_cpu(xp->cmd_and_length);
537 tp->ipcss = xp->lower_setup.ip_fields.ipcss;
538 tp->ipcso = xp->lower_setup.ip_fields.ipcso;
539 tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
540 tp->tucss = xp->upper_setup.tcp_fields.tucss;
541 tp->tucso = xp->upper_setup.tcp_fields.tucso;
542 tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
543 tp->paylen = op & 0xfffff;
544 tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
545 tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
546 tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
547 tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
548 tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
549 tp->tso_frames = 0;
550 if (tp->tucso == 0) { // this is probably wrong
551 DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
552 tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
553 }
554 return;
1b0009db
AZ
555 } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
556 // data descriptor
735e77ec
SH
557 if (tp->size == 0) {
558 tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
559 }
1b0009db 560 tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
43ad7e3e 561 } else {
1b0009db
AZ
562 // legacy descriptor
563 tp->cptse = 0;
43ad7e3e 564 }
7c23b892 565
8f2e8d1f
AL
566 if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
567 (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
568 tp->vlan_needed = 1;
569 cpu_to_be16wu((uint16_t *)(tp->vlan_header),
570 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
571 cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
572 le16_to_cpu(dp->upper.fields.special));
573 }
574
7c23b892 575 addr = le64_to_cpu(dp->buffer_addr);
1b0009db 576 if (tp->tse && tp->cptse) {
7c23b892
AZ
577 hdr = tp->hdr_len;
578 msh = hdr + tp->mss;
1b0009db
AZ
579 do {
580 bytes = split_size;
581 if (tp->size + bytes > msh)
582 bytes = msh - tp->size;
65f82df0
AL
583
584 bytes = MIN(sizeof(tp->data) - tp->size, bytes);
62ecbd35 585 pci_dma_read(&s->dev, addr, tp->data + tp->size, bytes);
1b0009db
AZ
586 if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
587 memmove(tp->header, tp->data, hdr);
588 tp->size = sz;
589 addr += bytes;
590 if (sz == msh) {
591 xmit_seg(s);
592 memmove(tp->data, tp->header, hdr);
593 tp->size = hdr;
594 }
595 } while (split_size -= bytes);
596 } else if (!tp->tse && tp->cptse) {
597 // context descriptor TSE is not set, while data descriptor TSE is set
362f5fb5 598 DBGOUT(TXERR, "TCP segmentation error\n");
1b0009db 599 } else {
65f82df0 600 split_size = MIN(sizeof(tp->data) - tp->size, split_size);
62ecbd35 601 pci_dma_read(&s->dev, addr, tp->data + tp->size, split_size);
1b0009db 602 tp->size += split_size;
7c23b892 603 }
7c23b892
AZ
604
605 if (!(txd_lower & E1000_TXD_CMD_EOP))
606 return;
1b0009db 607 if (!(tp->tse && tp->cptse && tp->size < hdr))
7c23b892
AZ
608 xmit_seg(s);
609 tp->tso_frames = 0;
610 tp->sum_needed = 0;
8f2e8d1f 611 tp->vlan_needed = 0;
7c23b892 612 tp->size = 0;
1b0009db 613 tp->cptse = 0;
7c23b892
AZ
614}
615
616static uint32_t
62ecbd35 617txdesc_writeback(E1000State *s, dma_addr_t base, struct e1000_tx_desc *dp)
7c23b892
AZ
618{
619 uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
620
621 if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
622 return 0;
623 txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
624 ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
625 dp->upper.data = cpu_to_le32(txd_upper);
62ecbd35 626 pci_dma_write(&s->dev, base + ((char *)&dp->upper - (char *)dp),
00c3a05b 627 &dp->upper, sizeof(dp->upper));
7c23b892
AZ
628 return E1000_ICR_TXDW;
629}
630
d17161f6
KW
631static uint64_t tx_desc_base(E1000State *s)
632{
633 uint64_t bah = s->mac_reg[TDBAH];
634 uint64_t bal = s->mac_reg[TDBAL] & ~0xf;
635
636 return (bah << 32) + bal;
637}
638
7c23b892
AZ
639static void
640start_xmit(E1000State *s)
641{
62ecbd35 642 dma_addr_t base;
7c23b892
AZ
643 struct e1000_tx_desc desc;
644 uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
645
646 if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
647 DBGOUT(TX, "tx disabled\n");
648 return;
649 }
650
651 while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
d17161f6 652 base = tx_desc_base(s) +
7c23b892 653 sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
00c3a05b 654 pci_dma_read(&s->dev, base, &desc, sizeof(desc));
7c23b892
AZ
655
656 DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
6106075b 657 (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
7c23b892
AZ
658 desc.upper.data);
659
660 process_tx_desc(s, &desc);
62ecbd35 661 cause |= txdesc_writeback(s, base, &desc);
7c23b892
AZ
662
663 if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
664 s->mac_reg[TDH] = 0;
665 /*
666 * the following could happen only if guest sw assigns
667 * bogus values to TDT/TDLEN.
668 * there's nothing too intelligent we could do about this.
669 */
670 if (s->mac_reg[TDH] == tdh_start) {
671 DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
672 tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
673 break;
674 }
675 }
676 set_ics(s, 0, cause);
677}
678
679static int
680receive_filter(E1000State *s, const uint8_t *buf, int size)
681{
af2960f9
BS
682 static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
683 static const int mta_shift[] = {4, 3, 2, 0};
7c23b892
AZ
684 uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
685
8f2e8d1f
AL
686 if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
687 uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
688 uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
689 ((vid >> 5) & 0x7f));
690 if ((vfta & (1 << (vid & 0x1f))) == 0)
691 return 0;
692 }
693
7c23b892
AZ
694 if (rctl & E1000_RCTL_UPE) // promiscuous
695 return 1;
696
697 if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE)) // promiscuous mcast
698 return 1;
699
700 if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
701 return 1;
702
703 for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
704 if (!(rp[1] & E1000_RAH_AV))
705 continue;
706 ra[0] = cpu_to_le32(rp[0]);
707 ra[1] = cpu_to_le32(rp[1]);
708 if (!memcmp(buf, (uint8_t *)ra, 6)) {
709 DBGOUT(RXFILTER,
710 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
711 (int)(rp - s->mac_reg - RA)/2,
712 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
713 return 1;
714 }
715 }
716 DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
717 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
718
719 f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
720 f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
721 if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
722 return 1;
723 DBGOUT(RXFILTER,
724 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
725 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
726 (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
727 s->mac_reg[MTA + (f >> 5)]);
728
729 return 0;
730}
731
99ed7e30 732static void
4e68f7a0 733e1000_set_link_status(NetClientState *nc)
99ed7e30 734{
a03e2aec 735 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
99ed7e30
AL
736 uint32_t old_status = s->mac_reg[STATUS];
737
d4044c2a 738 if (nc->link_down) {
71aadd3c 739 e1000_link_down(s);
d4044c2a 740 } else {
71aadd3c 741 e1000_link_up(s);
d4044c2a 742 }
99ed7e30
AL
743
744 if (s->mac_reg[STATUS] != old_status)
745 set_ics(s, 0, E1000_ICR_LSC);
746}
747
322fd48a
MT
748static bool e1000_has_rxbufs(E1000State *s, size_t total_size)
749{
750 int bufs;
751 /* Fast-path short packets */
752 if (total_size <= s->rxbuf_size) {
e5b8b0d4 753 return s->mac_reg[RDH] != s->mac_reg[RDT];
322fd48a
MT
754 }
755 if (s->mac_reg[RDH] < s->mac_reg[RDT]) {
756 bufs = s->mac_reg[RDT] - s->mac_reg[RDH];
e5b8b0d4 757 } else if (s->mac_reg[RDH] > s->mac_reg[RDT]) {
322fd48a
MT
758 bufs = s->mac_reg[RDLEN] / sizeof(struct e1000_rx_desc) +
759 s->mac_reg[RDT] - s->mac_reg[RDH];
760 } else {
761 return false;
762 }
763 return total_size <= bufs * s->rxbuf_size;
764}
765
6cdfab28 766static int
4e68f7a0 767e1000_can_receive(NetClientState *nc)
6cdfab28
MT
768{
769 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
770
771 return (s->mac_reg[RCTL] & E1000_RCTL_EN) && e1000_has_rxbufs(s, 1);
772}
773
d17161f6
KW
774static uint64_t rx_desc_base(E1000State *s)
775{
776 uint64_t bah = s->mac_reg[RDBAH];
777 uint64_t bal = s->mac_reg[RDBAL] & ~0xf;
778
779 return (bah << 32) + bal;
780}
781
4f1c942b 782static ssize_t
4e68f7a0 783e1000_receive(NetClientState *nc, const uint8_t *buf, size_t size)
7c23b892 784{
a03e2aec 785 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
7c23b892 786 struct e1000_rx_desc desc;
62ecbd35 787 dma_addr_t base;
7c23b892
AZ
788 unsigned int n, rdt;
789 uint32_t rdh_start;
8f2e8d1f
AL
790 uint16_t vlan_special = 0;
791 uint8_t vlan_status = 0, vlan_offset = 0;
78aeb23e 792 uint8_t min_buf[MIN_BUF_SIZE];
b19487e2
MT
793 size_t desc_offset;
794 size_t desc_size;
795 size_t total_size;
7c23b892
AZ
796
797 if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
4f1c942b 798 return -1;
7c23b892 799
78aeb23e
SH
800 /* Pad to minimum Ethernet frame length */
801 if (size < sizeof(min_buf)) {
802 memcpy(min_buf, buf, size);
803 memset(&min_buf[size], 0, sizeof(min_buf) - size);
804 buf = min_buf;
805 size = sizeof(min_buf);
806 }
807
7c23b892 808 if (!receive_filter(s, buf, size))
4f1c942b 809 return size;
7c23b892 810
8f2e8d1f
AL
811 if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
812 vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
98835fe3 813 memmove((uint8_t *)buf + 4, buf, 12);
8f2e8d1f
AL
814 vlan_status = E1000_RXD_STAT_VP;
815 vlan_offset = 4;
816 size -= 4;
817 }
818
7c23b892 819 rdh_start = s->mac_reg[RDH];
b19487e2
MT
820 desc_offset = 0;
821 total_size = size + fcs_len(s);
322fd48a
MT
822 if (!e1000_has_rxbufs(s, total_size)) {
823 set_ics(s, 0, E1000_ICS_RXO);
824 return -1;
825 }
7c23b892 826 do {
b19487e2
MT
827 desc_size = total_size - desc_offset;
828 if (desc_size > s->rxbuf_size) {
829 desc_size = s->rxbuf_size;
830 }
d17161f6 831 base = rx_desc_base(s) + sizeof(desc) * s->mac_reg[RDH];
00c3a05b 832 pci_dma_read(&s->dev, base, &desc, sizeof(desc));
8f2e8d1f
AL
833 desc.special = vlan_special;
834 desc.status |= (vlan_status | E1000_RXD_STAT_DD);
7c23b892 835 if (desc.buffer_addr) {
b19487e2
MT
836 if (desc_offset < size) {
837 size_t copy_size = size - desc_offset;
838 if (copy_size > s->rxbuf_size) {
839 copy_size = s->rxbuf_size;
840 }
62ecbd35 841 pci_dma_write(&s->dev, le64_to_cpu(desc.buffer_addr),
00c3a05b 842 buf + desc_offset + vlan_offset, copy_size);
b19487e2
MT
843 }
844 desc_offset += desc_size;
ee912ccf 845 desc.length = cpu_to_le16(desc_size);
b19487e2 846 if (desc_offset >= total_size) {
b19487e2
MT
847 desc.status |= E1000_RXD_STAT_EOP | E1000_RXD_STAT_IXSM;
848 } else {
ee912ccf
MT
849 /* Guest zeroing out status is not a hardware requirement.
850 Clear EOP in case guest didn't do it. */
851 desc.status &= ~E1000_RXD_STAT_EOP;
b19487e2 852 }
43ad7e3e 853 } else { // as per intel docs; skip descriptors with null buf addr
7c23b892 854 DBGOUT(RX, "Null RX descriptor!!\n");
43ad7e3e 855 }
00c3a05b 856 pci_dma_write(&s->dev, base, &desc, sizeof(desc));
7c23b892
AZ
857
858 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
859 s->mac_reg[RDH] = 0;
7c23b892
AZ
860 /* see comment in start_xmit; same here */
861 if (s->mac_reg[RDH] == rdh_start) {
862 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
863 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
864 set_ics(s, 0, E1000_ICS_RXO);
4f1c942b 865 return -1;
7c23b892 866 }
b19487e2 867 } while (desc_offset < total_size);
7c23b892
AZ
868
869 s->mac_reg[GPRC]++;
870 s->mac_reg[TPR]++;
a05e8a6e
MT
871 /* TOR - Total Octets Received:
872 * This register includes bytes received in a packet from the <Destination
873 * Address> field through the <CRC> field, inclusively.
874 */
875 n = s->mac_reg[TORL] + size + /* Always include FCS length. */ 4;
876 if (n < s->mac_reg[TORL])
7c23b892 877 s->mac_reg[TORH]++;
a05e8a6e 878 s->mac_reg[TORL] = n;
7c23b892
AZ
879
880 n = E1000_ICS_RXT0;
881 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
882 rdt += s->mac_reg[RDLEN] / sizeof(desc);
bf16cc8f
AL
883 if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
884 s->rxbuf_min_shift)
7c23b892
AZ
885 n |= E1000_ICS_RXDMT0;
886
887 set_ics(s, 0, n);
4f1c942b
MM
888
889 return size;
7c23b892
AZ
890}
891
892static uint32_t
893mac_readreg(E1000State *s, int index)
894{
895 return s->mac_reg[index];
896}
897
898static uint32_t
899mac_icr_read(E1000State *s, int index)
900{
901 uint32_t ret = s->mac_reg[ICR];
902
903 DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
904 set_interrupt_cause(s, 0, 0);
905 return ret;
906}
907
908static uint32_t
909mac_read_clr4(E1000State *s, int index)
910{
911 uint32_t ret = s->mac_reg[index];
912
913 s->mac_reg[index] = 0;
914 return ret;
915}
916
917static uint32_t
918mac_read_clr8(E1000State *s, int index)
919{
920 uint32_t ret = s->mac_reg[index];
921
922 s->mac_reg[index] = 0;
923 s->mac_reg[index-1] = 0;
924 return ret;
925}
926
927static void
928mac_writereg(E1000State *s, int index, uint32_t val)
929{
930 s->mac_reg[index] = val;
931}
932
933static void
934set_rdt(E1000State *s, int index, uint32_t val)
935{
7c23b892 936 s->mac_reg[index] = val & 0xffff;
e8b4c680
PB
937 if (e1000_has_rxbufs(s, 1)) {
938 qemu_flush_queued_packets(&s->nic->nc);
939 }
7c23b892
AZ
940}
941
942static void
943set_16bit(E1000State *s, int index, uint32_t val)
944{
945 s->mac_reg[index] = val & 0xffff;
946}
947
948static void
949set_dlen(E1000State *s, int index, uint32_t val)
950{
951 s->mac_reg[index] = val & 0xfff80;
952}
953
954static void
955set_tctl(E1000State *s, int index, uint32_t val)
956{
957 s->mac_reg[index] = val;
958 s->mac_reg[TDT] &= 0xffff;
959 start_xmit(s);
960}
961
962static void
963set_icr(E1000State *s, int index, uint32_t val)
964{
965 DBGOUT(INTERRUPT, "set_icr %x\n", val);
966 set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
967}
968
969static void
970set_imc(E1000State *s, int index, uint32_t val)
971{
972 s->mac_reg[IMS] &= ~val;
973 set_ics(s, 0, 0);
974}
975
976static void
977set_ims(E1000State *s, int index, uint32_t val)
978{
979 s->mac_reg[IMS] |= val;
980 set_ics(s, 0, 0);
981}
982
983#define getreg(x) [x] = mac_readreg
984static uint32_t (*macreg_readops[])(E1000State *, int) = {
985 getreg(PBA), getreg(RCTL), getreg(TDH), getreg(TXDCTL),
986 getreg(WUFC), getreg(TDT), getreg(CTRL), getreg(LEDCTL),
987 getreg(MANC), getreg(MDIC), getreg(SWSM), getreg(STATUS),
988 getreg(TORL), getreg(TOTL), getreg(IMS), getreg(TCTL),
b1332393 989 getreg(RDH), getreg(RDT), getreg(VET), getreg(ICS),
a00b2335
KA
990 getreg(TDBAL), getreg(TDBAH), getreg(RDBAH), getreg(RDBAL),
991 getreg(TDLEN), getreg(RDLEN),
7c23b892
AZ
992
993 [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8, [GPRC] = mac_read_clr4,
994 [GPTC] = mac_read_clr4, [TPR] = mac_read_clr4, [TPT] = mac_read_clr4,
995 [ICR] = mac_icr_read, [EECD] = get_eecd, [EERD] = flash_eerd_read,
996 [CRCERRS ... MPC] = &mac_readreg,
997 [RA ... RA+31] = &mac_readreg,
998 [MTA ... MTA+127] = &mac_readreg,
8f2e8d1f 999 [VFTA ... VFTA+127] = &mac_readreg,
7c23b892 1000};
b1503cda 1001enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
7c23b892
AZ
1002
1003#define putreg(x) [x] = mac_writereg
1004static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
1005 putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC),
1006 putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH),
cab3c825 1007 putreg(RDBAL), putreg(LEDCTL), putreg(VET),
7c23b892
AZ
1008 [TDLEN] = set_dlen, [RDLEN] = set_dlen, [TCTL] = set_tctl,
1009 [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics,
1010 [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt,
1011 [IMC] = set_imc, [IMS] = set_ims, [ICR] = set_icr,
cab3c825 1012 [EECD] = set_eecd, [RCTL] = set_rx_control, [CTRL] = set_ctrl,
7c23b892
AZ
1013 [RA ... RA+31] = &mac_writereg,
1014 [MTA ... MTA+127] = &mac_writereg,
8f2e8d1f 1015 [VFTA ... VFTA+127] = &mac_writereg,
7c23b892 1016};
b9d03e35 1017
b1503cda 1018enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
7c23b892
AZ
1019
1020static void
a8170e5e 1021e1000_mmio_write(void *opaque, hwaddr addr, uint64_t val,
ad00a9b9 1022 unsigned size)
7c23b892
AZ
1023{
1024 E1000State *s = opaque;
8da3ff18 1025 unsigned int index = (addr & 0x1ffff) >> 2;
7c23b892 1026
43ad7e3e 1027 if (index < NWRITEOPS && macreg_writeops[index]) {
6b59fc74 1028 macreg_writeops[index](s, index, val);
43ad7e3e 1029 } else if (index < NREADOPS && macreg_readops[index]) {
ad00a9b9 1030 DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04"PRIx64"\n", index<<2, val);
43ad7e3e 1031 } else {
ad00a9b9 1032 DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08"PRIx64"\n",
7c23b892 1033 index<<2, val);
43ad7e3e 1034 }
7c23b892
AZ
1035}
1036
ad00a9b9 1037static uint64_t
a8170e5e 1038e1000_mmio_read(void *opaque, hwaddr addr, unsigned size)
7c23b892
AZ
1039{
1040 E1000State *s = opaque;
8da3ff18 1041 unsigned int index = (addr & 0x1ffff) >> 2;
7c23b892
AZ
1042
1043 if (index < NREADOPS && macreg_readops[index])
6b59fc74 1044 {
32600a30 1045 return macreg_readops[index](s, index);
6b59fc74 1046 }
7c23b892
AZ
1047 DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
1048 return 0;
1049}
1050
ad00a9b9
AK
1051static const MemoryRegionOps e1000_mmio_ops = {
1052 .read = e1000_mmio_read,
1053 .write = e1000_mmio_write,
1054 .endianness = DEVICE_LITTLE_ENDIAN,
1055 .impl = {
1056 .min_access_size = 4,
1057 .max_access_size = 4,
1058 },
1059};
1060
a8170e5e 1061static uint64_t e1000_io_read(void *opaque, hwaddr addr,
ad00a9b9 1062 unsigned size)
7c23b892 1063{
ad00a9b9
AK
1064 E1000State *s = opaque;
1065
1066 (void)s;
1067 return 0;
7c23b892
AZ
1068}
1069
a8170e5e 1070static void e1000_io_write(void *opaque, hwaddr addr,
ad00a9b9 1071 uint64_t val, unsigned size)
7c23b892 1072{
ad00a9b9
AK
1073 E1000State *s = opaque;
1074
1075 (void)s;
7c23b892
AZ
1076}
1077
ad00a9b9
AK
1078static const MemoryRegionOps e1000_io_ops = {
1079 .read = e1000_io_read,
1080 .write = e1000_io_write,
1081 .endianness = DEVICE_LITTLE_ENDIAN,
1082};
1083
e482dc3e 1084static bool is_version_1(void *opaque, int version_id)
7c23b892 1085{
e482dc3e 1086 return version_id == 1;
7c23b892
AZ
1087}
1088
e4b82364
AK
1089static int e1000_post_load(void *opaque, int version_id)
1090{
1091 E1000State *s = opaque;
1092
1093 /* nc.link_down can't be migrated, so infer link_down according
1094 * to link status bit in mac_reg[STATUS] */
1095 s->nic->nc.link_down = (s->mac_reg[STATUS] & E1000_STATUS_LU) == 0;
1096
1097 return 0;
1098}
1099
e482dc3e
JQ
1100static const VMStateDescription vmstate_e1000 = {
1101 .name = "e1000",
1102 .version_id = 2,
1103 .minimum_version_id = 1,
1104 .minimum_version_id_old = 1,
e4b82364 1105 .post_load = e1000_post_load,
e482dc3e
JQ
1106 .fields = (VMStateField []) {
1107 VMSTATE_PCI_DEVICE(dev, E1000State),
1108 VMSTATE_UNUSED_TEST(is_version_1, 4), /* was instance id */
1109 VMSTATE_UNUSED(4), /* Was mmio_base. */
1110 VMSTATE_UINT32(rxbuf_size, E1000State),
1111 VMSTATE_UINT32(rxbuf_min_shift, E1000State),
1112 VMSTATE_UINT32(eecd_state.val_in, E1000State),
1113 VMSTATE_UINT16(eecd_state.bitnum_in, E1000State),
1114 VMSTATE_UINT16(eecd_state.bitnum_out, E1000State),
1115 VMSTATE_UINT16(eecd_state.reading, E1000State),
1116 VMSTATE_UINT32(eecd_state.old_eecd, E1000State),
1117 VMSTATE_UINT8(tx.ipcss, E1000State),
1118 VMSTATE_UINT8(tx.ipcso, E1000State),
1119 VMSTATE_UINT16(tx.ipcse, E1000State),
1120 VMSTATE_UINT8(tx.tucss, E1000State),
1121 VMSTATE_UINT8(tx.tucso, E1000State),
1122 VMSTATE_UINT16(tx.tucse, E1000State),
1123 VMSTATE_UINT32(tx.paylen, E1000State),
1124 VMSTATE_UINT8(tx.hdr_len, E1000State),
1125 VMSTATE_UINT16(tx.mss, E1000State),
1126 VMSTATE_UINT16(tx.size, E1000State),
1127 VMSTATE_UINT16(tx.tso_frames, E1000State),
1128 VMSTATE_UINT8(tx.sum_needed, E1000State),
1129 VMSTATE_INT8(tx.ip, E1000State),
1130 VMSTATE_INT8(tx.tcp, E1000State),
1131 VMSTATE_BUFFER(tx.header, E1000State),
1132 VMSTATE_BUFFER(tx.data, E1000State),
1133 VMSTATE_UINT16_ARRAY(eeprom_data, E1000State, 64),
1134 VMSTATE_UINT16_ARRAY(phy_reg, E1000State, 0x20),
1135 VMSTATE_UINT32(mac_reg[CTRL], E1000State),
1136 VMSTATE_UINT32(mac_reg[EECD], E1000State),
1137 VMSTATE_UINT32(mac_reg[EERD], E1000State),
1138 VMSTATE_UINT32(mac_reg[GPRC], E1000State),
1139 VMSTATE_UINT32(mac_reg[GPTC], E1000State),
1140 VMSTATE_UINT32(mac_reg[ICR], E1000State),
1141 VMSTATE_UINT32(mac_reg[ICS], E1000State),
1142 VMSTATE_UINT32(mac_reg[IMC], E1000State),
1143 VMSTATE_UINT32(mac_reg[IMS], E1000State),
1144 VMSTATE_UINT32(mac_reg[LEDCTL], E1000State),
1145 VMSTATE_UINT32(mac_reg[MANC], E1000State),
1146 VMSTATE_UINT32(mac_reg[MDIC], E1000State),
1147 VMSTATE_UINT32(mac_reg[MPC], E1000State),
1148 VMSTATE_UINT32(mac_reg[PBA], E1000State),
1149 VMSTATE_UINT32(mac_reg[RCTL], E1000State),
1150 VMSTATE_UINT32(mac_reg[RDBAH], E1000State),
1151 VMSTATE_UINT32(mac_reg[RDBAL], E1000State),
1152 VMSTATE_UINT32(mac_reg[RDH], E1000State),
1153 VMSTATE_UINT32(mac_reg[RDLEN], E1000State),
1154 VMSTATE_UINT32(mac_reg[RDT], E1000State),
1155 VMSTATE_UINT32(mac_reg[STATUS], E1000State),
1156 VMSTATE_UINT32(mac_reg[SWSM], E1000State),
1157 VMSTATE_UINT32(mac_reg[TCTL], E1000State),
1158 VMSTATE_UINT32(mac_reg[TDBAH], E1000State),
1159 VMSTATE_UINT32(mac_reg[TDBAL], E1000State),
1160 VMSTATE_UINT32(mac_reg[TDH], E1000State),
1161 VMSTATE_UINT32(mac_reg[TDLEN], E1000State),
1162 VMSTATE_UINT32(mac_reg[TDT], E1000State),
1163 VMSTATE_UINT32(mac_reg[TORH], E1000State),
1164 VMSTATE_UINT32(mac_reg[TORL], E1000State),
1165 VMSTATE_UINT32(mac_reg[TOTH], E1000State),
1166 VMSTATE_UINT32(mac_reg[TOTL], E1000State),
1167 VMSTATE_UINT32(mac_reg[TPR], E1000State),
1168 VMSTATE_UINT32(mac_reg[TPT], E1000State),
1169 VMSTATE_UINT32(mac_reg[TXDCTL], E1000State),
1170 VMSTATE_UINT32(mac_reg[WUFC], E1000State),
1171 VMSTATE_UINT32(mac_reg[VET], E1000State),
1172 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, RA, 32),
1173 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, 128),
1174 VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA, 128),
1175 VMSTATE_END_OF_LIST()
1176 }
1177};
7c23b892 1178
88b4e9db 1179static const uint16_t e1000_eeprom_template[64] = {
7c23b892
AZ
1180 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
1181 0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
1182 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
1183 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
1184 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
1185 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1186 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1187 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
1188};
1189
7c23b892
AZ
1190/* PCI interface */
1191
7c23b892 1192static void
ad00a9b9 1193e1000_mmio_setup(E1000State *d)
7c23b892 1194{
f65ed4c1
AL
1195 int i;
1196 const uint32_t excluded_regs[] = {
1197 E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
1198 E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
1199 };
1200
ad00a9b9
AK
1201 memory_region_init_io(&d->mmio, &e1000_mmio_ops, d, "e1000-mmio",
1202 PNPMMIO_SIZE);
1203 memory_region_add_coalescing(&d->mmio, 0, excluded_regs[0]);
f65ed4c1 1204 for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
ad00a9b9
AK
1205 memory_region_add_coalescing(&d->mmio, excluded_regs[i] + 4,
1206 excluded_regs[i+1] - excluded_regs[i] - 4);
1207 memory_region_init_io(&d->io, &e1000_io_ops, d, "e1000-io", IOPORT_SIZE);
7c23b892
AZ
1208}
1209
b946a153 1210static void
4e68f7a0 1211e1000_cleanup(NetClientState *nc)
b946a153 1212{
a03e2aec 1213 E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
b946a153 1214
a03e2aec 1215 s->nic = NULL;
b946a153
AL
1216}
1217
f90c2bcd 1218static void
4b09be85
AL
1219pci_e1000_uninit(PCIDevice *dev)
1220{
7d9e52bd 1221 E1000State *d = DO_UPCAST(E1000State, dev, dev);
4b09be85 1222
b9d03e35
JW
1223 qemu_del_timer(d->autoneg_timer);
1224 qemu_free_timer(d->autoneg_timer);
ad00a9b9
AK
1225 memory_region_destroy(&d->mmio);
1226 memory_region_destroy(&d->io);
b20c6b9e 1227 qemu_del_net_client(&d->nic->nc);
4b09be85
AL
1228}
1229
a03e2aec 1230static NetClientInfo net_e1000_info = {
2be64a68 1231 .type = NET_CLIENT_OPTIONS_KIND_NIC,
a03e2aec
MM
1232 .size = sizeof(NICState),
1233 .can_receive = e1000_can_receive,
1234 .receive = e1000_receive,
1235 .cleanup = e1000_cleanup,
1236 .link_status_changed = e1000_set_link_status,
1237};
1238
81a322d4 1239static int pci_e1000_init(PCIDevice *pci_dev)
7c23b892 1240{
7d9e52bd 1241 E1000State *d = DO_UPCAST(E1000State, dev, pci_dev);
7c23b892 1242 uint8_t *pci_conf;
7c23b892 1243 uint16_t checksum = 0;
7c23b892 1244 int i;
fbdaa002 1245 uint8_t *macaddr;
aff427a1 1246
7c23b892 1247 pci_conf = d->dev.config;
7c23b892 1248
a9cbacb0
MT
1249 /* TODO: RST# value should be 0, PCI spec 6.2.4 */
1250 pci_conf[PCI_CACHE_LINE_SIZE] = 0x10;
7c23b892 1251
817e0b6f 1252 pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
7c23b892 1253
ad00a9b9 1254 e1000_mmio_setup(d);
7c23b892 1255
e824b2cc 1256 pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &d->mmio);
7c23b892 1257
e824b2cc 1258 pci_register_bar(&d->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &d->io);
7c23b892 1259
7c23b892
AZ
1260 memmove(d->eeprom_data, e1000_eeprom_template,
1261 sizeof e1000_eeprom_template);
fbdaa002
GH
1262 qemu_macaddr_default_if_unset(&d->conf.macaddr);
1263 macaddr = d->conf.macaddr.a;
7c23b892 1264 for (i = 0; i < 3; i++)
9d07d757 1265 d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
7c23b892
AZ
1266 for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1267 checksum += d->eeprom_data[i];
1268 checksum = (uint16_t) EEPROM_SUM - checksum;
1269 d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
1270
a03e2aec 1271 d->nic = qemu_new_nic(&net_e1000_info, &d->conf,
f79f2bfc 1272 object_get_typename(OBJECT(d)), d->dev.qdev.id, d);
7c23b892 1273
a03e2aec 1274 qemu_format_nic_info_str(&d->nic->nc, macaddr);
1ca4d09a
GN
1275
1276 add_boot_device_path(d->conf.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
1277
b9d03e35
JW
1278 d->autoneg_timer = qemu_new_timer_ms(vm_clock, e1000_autoneg_timer, d);
1279
81a322d4 1280 return 0;
9d07d757 1281}
72da4208 1282
fbdaa002
GH
1283static void qdev_e1000_reset(DeviceState *dev)
1284{
1285 E1000State *d = DO_UPCAST(E1000State, dev.qdev, dev);
1286 e1000_reset(d);
1287}
1288
40021f08
AL
1289static Property e1000_properties[] = {
1290 DEFINE_NIC_PROPERTIES(E1000State, conf),
1291 DEFINE_PROP_END_OF_LIST(),
1292};
1293
1294static void e1000_class_init(ObjectClass *klass, void *data)
1295{
39bffca2 1296 DeviceClass *dc = DEVICE_CLASS(klass);
40021f08
AL
1297 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1298
1299 k->init = pci_e1000_init;
1300 k->exit = pci_e1000_uninit;
1301 k->romfile = "pxe-e1000.rom";
1302 k->vendor_id = PCI_VENDOR_ID_INTEL;
1303 k->device_id = E1000_DEVID;
1304 k->revision = 0x03;
1305 k->class_id = PCI_CLASS_NETWORK_ETHERNET;
39bffca2
AL
1306 dc->desc = "Intel Gigabit Ethernet";
1307 dc->reset = qdev_e1000_reset;
1308 dc->vmsd = &vmstate_e1000;
1309 dc->props = e1000_properties;
40021f08
AL
1310}
1311
39bffca2
AL
1312static TypeInfo e1000_info = {
1313 .name = "e1000",
1314 .parent = TYPE_PCI_DEVICE,
1315 .instance_size = sizeof(E1000State),
1316 .class_init = e1000_class_init,
0aab0d3a
GH
1317};
1318
83f7d43a 1319static void e1000_register_types(void)
9d07d757 1320{
39bffca2 1321 type_register_static(&e1000_info);
7c23b892 1322}
9d07d757 1323
83f7d43a 1324type_init(e1000_register_types)