]> git.proxmox.com Git - mirror_qemu.git/blame - hw/e1000.c
Add monitor_get_fd() command for fetching named fds
[mirror_qemu.git] / hw / e1000.c
CommitLineData
7c23b892
AZ
1/*
2 * QEMU e1000 emulation
3 *
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
9 *
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.
14 *
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.
19 *
20 * You should have received a copy of the GNU Lesser General Public
8167ee88 21 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
7c23b892
AZ
22 */
23
24
25#include "hw.h"
26#include "pci.h"
27#include "net.h"
28
7c23b892
AZ
29#include "e1000_hw.h"
30
31#define DEBUG
32
33#ifdef DEBUG
34enum {
35 DEBUG_GENERAL, DEBUG_IO, DEBUG_MMIO, DEBUG_INTERRUPT,
36 DEBUG_RX, DEBUG_TX, DEBUG_MDIC, DEBUG_EEPROM,
37 DEBUG_UNKNOWN, DEBUG_TXSUM, DEBUG_TXERR, DEBUG_RXERR,
38 DEBUG_RXFILTER, DEBUG_NOTYET,
39};
40#define DBGBIT(x) (1<<DEBUG_##x)
41static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
42
6c7f4b47 43#define DBGOUT(what, fmt, ...) do { \
7c23b892 44 if (debugflags & DBGBIT(what)) \
6c7f4b47 45 fprintf(stderr, "e1000: " fmt, ## __VA_ARGS__); \
7c23b892
AZ
46 } while (0)
47#else
6c7f4b47 48#define DBGOUT(what, fmt, ...) do {} while (0)
7c23b892
AZ
49#endif
50
51#define IOPORT_SIZE 0x40
e94bbefe 52#define PNPMMIO_SIZE 0x20000
7c23b892
AZ
53
54/*
55 * HW models:
56 * E1000_DEV_ID_82540EM works with Windows and Linux
57 * E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
58 * appears to perform better than 82540EM, but breaks with Linux 2.6.18
59 * E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
60 * Others never tested
61 */
62enum { E1000_DEVID = E1000_DEV_ID_82540EM };
63
64/*
65 * May need to specify additional MAC-to-PHY entries --
66 * Intel's Windows driver refuses to initialize unless they match
67 */
68enum {
69 PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ? 0xcc2 :
70 E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ? 0xc30 :
71 /* default to E1000_DEV_ID_82540EM */ 0xc20
72};
73
74typedef struct E1000State_st {
75 PCIDevice dev;
76 VLANClientState *vc;
7c23b892
AZ
77 int mmio_index;
78
79 uint32_t mac_reg[0x8000];
80 uint16_t phy_reg[0x20];
81 uint16_t eeprom_data[64];
82
83 uint32_t rxbuf_size;
84 uint32_t rxbuf_min_shift;
85 int check_rxov;
86 struct e1000_tx {
87 unsigned char header[256];
8f2e8d1f
AL
88 unsigned char vlan_header[4];
89 unsigned char vlan[4];
7c23b892
AZ
90 unsigned char data[0x10000];
91 uint16_t size;
92 unsigned char sum_needed;
8f2e8d1f 93 unsigned char vlan_needed;
7c23b892
AZ
94 uint8_t ipcss;
95 uint8_t ipcso;
96 uint16_t ipcse;
97 uint8_t tucss;
98 uint8_t tucso;
99 uint16_t tucse;
100 uint8_t hdr_len;
101 uint16_t mss;
102 uint32_t paylen;
103 uint16_t tso_frames;
104 char tse;
b6c4f71f
BS
105 int8_t ip;
106 int8_t tcp;
1b0009db 107 char cptse; // current packet tse bit
7c23b892
AZ
108 } tx;
109
110 struct {
111 uint32_t val_in; // shifted in from guest driver
112 uint16_t bitnum_in;
113 uint16_t bitnum_out;
114 uint16_t reading;
115 uint32_t old_eecd;
116 } eecd_state;
117} E1000State;
118
119#define defreg(x) x = (E1000_##x>>2)
120enum {
121 defreg(CTRL), defreg(EECD), defreg(EERD), defreg(GPRC),
122 defreg(GPTC), defreg(ICR), defreg(ICS), defreg(IMC),
123 defreg(IMS), defreg(LEDCTL), defreg(MANC), defreg(MDIC),
124 defreg(MPC), defreg(PBA), defreg(RCTL), defreg(RDBAH),
125 defreg(RDBAL), defreg(RDH), defreg(RDLEN), defreg(RDT),
126 defreg(STATUS), defreg(SWSM), defreg(TCTL), defreg(TDBAH),
127 defreg(TDBAL), defreg(TDH), defreg(TDLEN), defreg(TDT),
128 defreg(TORH), defreg(TORL), defreg(TOTH), defreg(TOTL),
129 defreg(TPR), defreg(TPT), defreg(TXDCTL), defreg(WUFC),
8f2e8d1f
AL
130 defreg(RA), defreg(MTA), defreg(CRCERRS),defreg(VFTA),
131 defreg(VET),
7c23b892
AZ
132};
133
134enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
88b4e9db 135static const char phy_regcap[0x20] = {
7c23b892
AZ
136 [PHY_STATUS] = PHY_R, [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
137 [PHY_ID1] = PHY_R, [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
138 [PHY_CTRL] = PHY_RW, [PHY_1000T_CTRL] = PHY_RW,
139 [PHY_LP_ABILITY] = PHY_R, [PHY_1000T_STATUS] = PHY_R,
140 [PHY_AUTONEG_ADV] = PHY_RW, [M88E1000_RX_ERR_CNTR] = PHY_R,
700f6e2c 141 [PHY_ID2] = PHY_R, [M88E1000_PHY_SPEC_STATUS] = PHY_R
7c23b892
AZ
142};
143
144static void
145ioport_map(PCIDevice *pci_dev, int region_num, uint32_t addr,
146 uint32_t size, int type)
147{
148 DBGOUT(IO, "e1000_ioport_map addr=0x%04x size=0x%08x\n", addr, size);
149}
150
151static void
152set_interrupt_cause(E1000State *s, int index, uint32_t val)
153{
154 if (val)
155 val |= E1000_ICR_INT_ASSERTED;
156 s->mac_reg[ICR] = val;
bc26e55a 157 qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
7c23b892
AZ
158}
159
160static void
161set_ics(E1000State *s, int index, uint32_t val)
162{
163 DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
164 s->mac_reg[IMS]);
165 set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
166}
167
168static int
169rxbufsize(uint32_t v)
170{
171 v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
172 E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
173 E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
174 switch (v) {
175 case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
176 return 16384;
177 case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
178 return 8192;
179 case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
180 return 4096;
181 case E1000_RCTL_SZ_1024:
182 return 1024;
183 case E1000_RCTL_SZ_512:
184 return 512;
185 case E1000_RCTL_SZ_256:
186 return 256;
187 }
188 return 2048;
189}
190
cab3c825
KW
191static void
192set_ctrl(E1000State *s, int index, uint32_t val)
193{
194 /* RST is self clearing */
195 s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
196}
197
7c23b892
AZ
198static void
199set_rx_control(E1000State *s, int index, uint32_t val)
200{
201 s->mac_reg[RCTL] = val;
202 s->rxbuf_size = rxbufsize(val);
203 s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
204 DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
205 s->mac_reg[RCTL]);
206}
207
208static void
209set_mdic(E1000State *s, int index, uint32_t val)
210{
211 uint32_t data = val & E1000_MDIC_DATA_MASK;
212 uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
213
214 if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
215 val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
216 else if (val & E1000_MDIC_OP_READ) {
217 DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
218 if (!(phy_regcap[addr] & PHY_R)) {
219 DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
220 val |= E1000_MDIC_ERROR;
221 } else
222 val = (val ^ data) | s->phy_reg[addr];
223 } else if (val & E1000_MDIC_OP_WRITE) {
224 DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
225 if (!(phy_regcap[addr] & PHY_W)) {
226 DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
227 val |= E1000_MDIC_ERROR;
228 } else
229 s->phy_reg[addr] = data;
230 }
231 s->mac_reg[MDIC] = val | E1000_MDIC_READY;
232 set_ics(s, 0, E1000_ICR_MDAC);
233}
234
235static uint32_t
236get_eecd(E1000State *s, int index)
237{
238 uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
239
240 DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
241 s->eecd_state.bitnum_out, s->eecd_state.reading);
242 if (!s->eecd_state.reading ||
243 ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
244 ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
245 ret |= E1000_EECD_DO;
246 return ret;
247}
248
249static void
250set_eecd(E1000State *s, int index, uint32_t val)
251{
252 uint32_t oldval = s->eecd_state.old_eecd;
253
254 s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
255 E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
256 if (!(E1000_EECD_SK & (val ^ oldval))) // no clock edge
257 return;
258 if (!(E1000_EECD_SK & val)) { // falling edge
259 s->eecd_state.bitnum_out++;
260 return;
261 }
262 if (!(val & E1000_EECD_CS)) { // rising, no CS (EEPROM reset)
263 memset(&s->eecd_state, 0, sizeof s->eecd_state);
356c7ff4
NS
264 /*
265 * restore old_eecd's E1000_EECD_SK (known to be on)
266 * to avoid false detection of a clock edge
267 */
268 s->eecd_state.old_eecd = E1000_EECD_SK;
7c23b892
AZ
269 return;
270 }
271 s->eecd_state.val_in <<= 1;
272 if (val & E1000_EECD_DI)
273 s->eecd_state.val_in |= 1;
274 if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
275 s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
276 s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
277 EEPROM_READ_OPCODE_MICROWIRE);
278 }
279 DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
280 s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
281 s->eecd_state.reading);
282}
283
284static uint32_t
285flash_eerd_read(E1000State *s, int x)
286{
287 unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
288
289 if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
290 return 0;
291 return (s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
292 E1000_EEPROM_RW_REG_DONE | r;
293}
294
7c23b892
AZ
295static void
296putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
297{
c6a6a5e3
AL
298 uint32_t sum;
299
7c23b892
AZ
300 if (cse && cse < n)
301 n = cse + 1;
c6a6a5e3
AL
302 if (sloc < n-1) {
303 sum = net_checksum_add(n-css, data+css);
7c23b892 304 cpu_to_be16wu((uint16_t *)(data + sloc),
c6a6a5e3
AL
305 net_checksum_finish(sum));
306 }
7c23b892
AZ
307}
308
8f2e8d1f
AL
309static inline int
310vlan_enabled(E1000State *s)
311{
312 return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
313}
314
315static inline int
316vlan_rx_filter_enabled(E1000State *s)
317{
318 return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
319}
320
321static inline int
322is_vlan_packet(E1000State *s, const uint8_t *buf)
323{
324 return (be16_to_cpup((uint16_t *)(buf + 12)) ==
325 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
326}
327
328static inline int
329is_vlan_txd(uint32_t txd_lower)
330{
331 return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
332}
333
7c23b892
AZ
334static void
335xmit_seg(E1000State *s)
336{
337 uint16_t len, *sp;
338 unsigned int frames = s->tx.tso_frames, css, sofar, n;
339 struct e1000_tx *tp = &s->tx;
340
1b0009db 341 if (tp->tse && tp->cptse) {
7c23b892
AZ
342 css = tp->ipcss;
343 DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
344 frames, tp->size, css);
345 if (tp->ip) { // IPv4
346 cpu_to_be16wu((uint16_t *)(tp->data+css+2),
347 tp->size - css);
348 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
349 be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
350 } else // IPv6
351 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
352 tp->size - css);
353 css = tp->tucss;
354 len = tp->size - css;
355 DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
356 if (tp->tcp) {
357 sofar = frames * tp->mss;
358 cpu_to_be32wu((uint32_t *)(tp->data+css+4), // seq
88738c09 359 be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
7c23b892
AZ
360 if (tp->paylen - sofar > tp->mss)
361 tp->data[css + 13] &= ~9; // PSH, FIN
362 } else // UDP
363 cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
364 if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
365 // add pseudo-header length before checksum calculation
366 sp = (uint16_t *)(tp->data + tp->tucso);
367 cpu_to_be16wu(sp, be16_to_cpup(sp) + len);
368 }
369 tp->tso_frames++;
370 }
371
372 if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
373 putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
374 if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
375 putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
8f2e8d1f
AL
376 if (tp->vlan_needed) {
377 memmove(tp->vlan, tp->data, 12);
378 memcpy(tp->data + 8, tp->vlan_header, 4);
379 qemu_send_packet(s->vc, tp->vlan, tp->size + 4);
380 } else
381 qemu_send_packet(s->vc, tp->data, tp->size);
7c23b892
AZ
382 s->mac_reg[TPT]++;
383 s->mac_reg[GPTC]++;
384 n = s->mac_reg[TOTL];
385 if ((s->mac_reg[TOTL] += s->tx.size) < n)
386 s->mac_reg[TOTH]++;
387}
388
389static void
390process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
391{
392 uint32_t txd_lower = le32_to_cpu(dp->lower.data);
393 uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
394 unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
395 unsigned int msh = 0xfffff, hdr = 0;
396 uint64_t addr;
397 struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
398 struct e1000_tx *tp = &s->tx;
399
400 if (dtype == E1000_TXD_CMD_DEXT) { // context descriptor
401 op = le32_to_cpu(xp->cmd_and_length);
402 tp->ipcss = xp->lower_setup.ip_fields.ipcss;
403 tp->ipcso = xp->lower_setup.ip_fields.ipcso;
404 tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
405 tp->tucss = xp->upper_setup.tcp_fields.tucss;
406 tp->tucso = xp->upper_setup.tcp_fields.tucso;
407 tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
408 tp->paylen = op & 0xfffff;
409 tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
410 tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
411 tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
412 tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
413 tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
414 tp->tso_frames = 0;
415 if (tp->tucso == 0) { // this is probably wrong
416 DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
417 tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
418 }
419 return;
1b0009db
AZ
420 } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
421 // data descriptor
7c23b892 422 tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
1b0009db
AZ
423 tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
424 } else
425 // legacy descriptor
426 tp->cptse = 0;
7c23b892 427
8f2e8d1f
AL
428 if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
429 (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
430 tp->vlan_needed = 1;
431 cpu_to_be16wu((uint16_t *)(tp->vlan_header),
432 le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
433 cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
434 le16_to_cpu(dp->upper.fields.special));
435 }
436
7c23b892 437 addr = le64_to_cpu(dp->buffer_addr);
1b0009db 438 if (tp->tse && tp->cptse) {
7c23b892
AZ
439 hdr = tp->hdr_len;
440 msh = hdr + tp->mss;
1b0009db
AZ
441 do {
442 bytes = split_size;
443 if (tp->size + bytes > msh)
444 bytes = msh - tp->size;
445 cpu_physical_memory_read(addr, tp->data + tp->size, bytes);
446 if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
447 memmove(tp->header, tp->data, hdr);
448 tp->size = sz;
449 addr += bytes;
450 if (sz == msh) {
451 xmit_seg(s);
452 memmove(tp->data, tp->header, hdr);
453 tp->size = hdr;
454 }
455 } while (split_size -= bytes);
456 } else if (!tp->tse && tp->cptse) {
457 // context descriptor TSE is not set, while data descriptor TSE is set
458 DBGOUT(TXERR, "TCP segmentaion Error\n");
459 } else {
460 cpu_physical_memory_read(addr, tp->data + tp->size, split_size);
461 tp->size += split_size;
7c23b892 462 }
7c23b892
AZ
463
464 if (!(txd_lower & E1000_TXD_CMD_EOP))
465 return;
1b0009db 466 if (!(tp->tse && tp->cptse && tp->size < hdr))
7c23b892
AZ
467 xmit_seg(s);
468 tp->tso_frames = 0;
469 tp->sum_needed = 0;
8f2e8d1f 470 tp->vlan_needed = 0;
7c23b892 471 tp->size = 0;
1b0009db 472 tp->cptse = 0;
7c23b892
AZ
473}
474
475static uint32_t
476txdesc_writeback(target_phys_addr_t base, struct e1000_tx_desc *dp)
477{
478 uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
479
480 if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
481 return 0;
482 txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
483 ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
484 dp->upper.data = cpu_to_le32(txd_upper);
485 cpu_physical_memory_write(base + ((char *)&dp->upper - (char *)dp),
486 (void *)&dp->upper, sizeof(dp->upper));
487 return E1000_ICR_TXDW;
488}
489
490static void
491start_xmit(E1000State *s)
492{
493 target_phys_addr_t base;
494 struct e1000_tx_desc desc;
495 uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
496
497 if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
498 DBGOUT(TX, "tx disabled\n");
499 return;
500 }
501
502 while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
503 base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
504 sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
505 cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
506
507 DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
6106075b 508 (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
7c23b892
AZ
509 desc.upper.data);
510
511 process_tx_desc(s, &desc);
512 cause |= txdesc_writeback(base, &desc);
513
514 if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
515 s->mac_reg[TDH] = 0;
516 /*
517 * the following could happen only if guest sw assigns
518 * bogus values to TDT/TDLEN.
519 * there's nothing too intelligent we could do about this.
520 */
521 if (s->mac_reg[TDH] == tdh_start) {
522 DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
523 tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
524 break;
525 }
526 }
527 set_ics(s, 0, cause);
528}
529
530static int
531receive_filter(E1000State *s, const uint8_t *buf, int size)
532{
533 static uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
534 static int mta_shift[] = {4, 3, 2, 0};
535 uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
536
8f2e8d1f
AL
537 if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
538 uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
539 uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
540 ((vid >> 5) & 0x7f));
541 if ((vfta & (1 << (vid & 0x1f))) == 0)
542 return 0;
543 }
544
7c23b892
AZ
545 if (rctl & E1000_RCTL_UPE) // promiscuous
546 return 1;
547
548 if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE)) // promiscuous mcast
549 return 1;
550
551 if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
552 return 1;
553
554 for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
555 if (!(rp[1] & E1000_RAH_AV))
556 continue;
557 ra[0] = cpu_to_le32(rp[0]);
558 ra[1] = cpu_to_le32(rp[1]);
559 if (!memcmp(buf, (uint8_t *)ra, 6)) {
560 DBGOUT(RXFILTER,
561 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
562 (int)(rp - s->mac_reg - RA)/2,
563 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
564 return 1;
565 }
566 }
567 DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
568 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
569
570 f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
571 f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
572 if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
573 return 1;
574 DBGOUT(RXFILTER,
575 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
576 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
577 (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
578 s->mac_reg[MTA + (f >> 5)]);
579
580 return 0;
581}
582
99ed7e30
AL
583static void
584e1000_set_link_status(VLANClientState *vc)
585{
586 E1000State *s = vc->opaque;
587 uint32_t old_status = s->mac_reg[STATUS];
588
589 if (vc->link_down)
590 s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
591 else
592 s->mac_reg[STATUS] |= E1000_STATUS_LU;
593
594 if (s->mac_reg[STATUS] != old_status)
595 set_ics(s, 0, E1000_ICR_LSC);
596}
597
7c23b892 598static int
e3f5ec2b 599e1000_can_receive(VLANClientState *vc)
7c23b892 600{
e3f5ec2b 601 E1000State *s = vc->opaque;
7c23b892 602
4105de67 603 return (s->mac_reg[RCTL] & E1000_RCTL_EN);
7c23b892
AZ
604}
605
4f1c942b 606static ssize_t
e3f5ec2b 607e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
7c23b892 608{
e3f5ec2b 609 E1000State *s = vc->opaque;
7c23b892
AZ
610 struct e1000_rx_desc desc;
611 target_phys_addr_t base;
612 unsigned int n, rdt;
613 uint32_t rdh_start;
8f2e8d1f
AL
614 uint16_t vlan_special = 0;
615 uint8_t vlan_status = 0, vlan_offset = 0;
7c23b892
AZ
616
617 if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
4f1c942b 618 return -1;
7c23b892
AZ
619
620 if (size > s->rxbuf_size) {
cda9046b
MM
621 DBGOUT(RX, "packet too large for buffers (%lu > %d)\n",
622 (unsigned long)size, s->rxbuf_size);
4f1c942b 623 return -1;
7c23b892
AZ
624 }
625
626 if (!receive_filter(s, buf, size))
4f1c942b 627 return size;
7c23b892 628
8f2e8d1f
AL
629 if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
630 vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
631 memmove((void *)(buf + 4), buf, 12);
632 vlan_status = E1000_RXD_STAT_VP;
633 vlan_offset = 4;
634 size -= 4;
635 }
636
7c23b892
AZ
637 rdh_start = s->mac_reg[RDH];
638 size += 4; // for the header
639 do {
640 if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) {
641 set_ics(s, 0, E1000_ICS_RXO);
4f1c942b 642 return -1;
7c23b892
AZ
643 }
644 base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
645 sizeof(desc) * s->mac_reg[RDH];
646 cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
8f2e8d1f
AL
647 desc.special = vlan_special;
648 desc.status |= (vlan_status | E1000_RXD_STAT_DD);
7c23b892
AZ
649 if (desc.buffer_addr) {
650 cpu_physical_memory_write(le64_to_cpu(desc.buffer_addr),
8f2e8d1f 651 (void *)(buf + vlan_offset), size);
7c23b892
AZ
652 desc.length = cpu_to_le16(size);
653 desc.status |= E1000_RXD_STAT_EOP|E1000_RXD_STAT_IXSM;
654 } else // as per intel docs; skip descriptors with null buf addr
655 DBGOUT(RX, "Null RX descriptor!!\n");
656 cpu_physical_memory_write(base, (void *)&desc, sizeof(desc));
657
658 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
659 s->mac_reg[RDH] = 0;
660 s->check_rxov = 1;
661 /* see comment in start_xmit; same here */
662 if (s->mac_reg[RDH] == rdh_start) {
663 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
664 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
665 set_ics(s, 0, E1000_ICS_RXO);
4f1c942b 666 return -1;
7c23b892
AZ
667 }
668 } while (desc.buffer_addr == 0);
669
670 s->mac_reg[GPRC]++;
671 s->mac_reg[TPR]++;
672 n = s->mac_reg[TORL];
673 if ((s->mac_reg[TORL] += size) < n)
674 s->mac_reg[TORH]++;
675
676 n = E1000_ICS_RXT0;
677 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
678 rdt += s->mac_reg[RDLEN] / sizeof(desc);
bf16cc8f
AL
679 if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
680 s->rxbuf_min_shift)
7c23b892
AZ
681 n |= E1000_ICS_RXDMT0;
682
683 set_ics(s, 0, n);
4f1c942b
MM
684
685 return size;
7c23b892
AZ
686}
687
688static uint32_t
689mac_readreg(E1000State *s, int index)
690{
691 return s->mac_reg[index];
692}
693
694static uint32_t
695mac_icr_read(E1000State *s, int index)
696{
697 uint32_t ret = s->mac_reg[ICR];
698
699 DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
700 set_interrupt_cause(s, 0, 0);
701 return ret;
702}
703
704static uint32_t
705mac_read_clr4(E1000State *s, int index)
706{
707 uint32_t ret = s->mac_reg[index];
708
709 s->mac_reg[index] = 0;
710 return ret;
711}
712
713static uint32_t
714mac_read_clr8(E1000State *s, int index)
715{
716 uint32_t ret = s->mac_reg[index];
717
718 s->mac_reg[index] = 0;
719 s->mac_reg[index-1] = 0;
720 return ret;
721}
722
723static void
724mac_writereg(E1000State *s, int index, uint32_t val)
725{
726 s->mac_reg[index] = val;
727}
728
729static void
730set_rdt(E1000State *s, int index, uint32_t val)
731{
732 s->check_rxov = 0;
733 s->mac_reg[index] = val & 0xffff;
734}
735
736static void
737set_16bit(E1000State *s, int index, uint32_t val)
738{
739 s->mac_reg[index] = val & 0xffff;
740}
741
742static void
743set_dlen(E1000State *s, int index, uint32_t val)
744{
745 s->mac_reg[index] = val & 0xfff80;
746}
747
748static void
749set_tctl(E1000State *s, int index, uint32_t val)
750{
751 s->mac_reg[index] = val;
752 s->mac_reg[TDT] &= 0xffff;
753 start_xmit(s);
754}
755
756static void
757set_icr(E1000State *s, int index, uint32_t val)
758{
759 DBGOUT(INTERRUPT, "set_icr %x\n", val);
760 set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
761}
762
763static void
764set_imc(E1000State *s, int index, uint32_t val)
765{
766 s->mac_reg[IMS] &= ~val;
767 set_ics(s, 0, 0);
768}
769
770static void
771set_ims(E1000State *s, int index, uint32_t val)
772{
773 s->mac_reg[IMS] |= val;
774 set_ics(s, 0, 0);
775}
776
777#define getreg(x) [x] = mac_readreg
778static uint32_t (*macreg_readops[])(E1000State *, int) = {
779 getreg(PBA), getreg(RCTL), getreg(TDH), getreg(TXDCTL),
780 getreg(WUFC), getreg(TDT), getreg(CTRL), getreg(LEDCTL),
781 getreg(MANC), getreg(MDIC), getreg(SWSM), getreg(STATUS),
782 getreg(TORL), getreg(TOTL), getreg(IMS), getreg(TCTL),
8f2e8d1f 783 getreg(RDH), getreg(RDT), getreg(VET),
7c23b892
AZ
784
785 [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8, [GPRC] = mac_read_clr4,
786 [GPTC] = mac_read_clr4, [TPR] = mac_read_clr4, [TPT] = mac_read_clr4,
787 [ICR] = mac_icr_read, [EECD] = get_eecd, [EERD] = flash_eerd_read,
788 [CRCERRS ... MPC] = &mac_readreg,
789 [RA ... RA+31] = &mac_readreg,
790 [MTA ... MTA+127] = &mac_readreg,
8f2e8d1f 791 [VFTA ... VFTA+127] = &mac_readreg,
7c23b892 792};
b1503cda 793enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
7c23b892
AZ
794
795#define putreg(x) [x] = mac_writereg
796static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
797 putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC),
798 putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH),
cab3c825 799 putreg(RDBAL), putreg(LEDCTL), putreg(VET),
7c23b892
AZ
800 [TDLEN] = set_dlen, [RDLEN] = set_dlen, [TCTL] = set_tctl,
801 [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics,
802 [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt,
803 [IMC] = set_imc, [IMS] = set_ims, [ICR] = set_icr,
cab3c825 804 [EECD] = set_eecd, [RCTL] = set_rx_control, [CTRL] = set_ctrl,
7c23b892
AZ
805 [RA ... RA+31] = &mac_writereg,
806 [MTA ... MTA+127] = &mac_writereg,
8f2e8d1f 807 [VFTA ... VFTA+127] = &mac_writereg,
7c23b892 808};
b1503cda 809enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
7c23b892
AZ
810
811static void
812e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
813{
814 E1000State *s = opaque;
8da3ff18 815 unsigned int index = (addr & 0x1ffff) >> 2;
7c23b892 816
6b59fc74
AJ
817#ifdef TARGET_WORDS_BIGENDIAN
818 val = bswap32(val);
819#endif
7c23b892 820 if (index < NWRITEOPS && macreg_writeops[index])
6b59fc74 821 macreg_writeops[index](s, index, val);
7c23b892
AZ
822 else if (index < NREADOPS && macreg_readops[index])
823 DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04x\n", index<<2, val);
824 else
825 DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
826 index<<2, val);
827}
828
829static void
830e1000_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
831{
832 // emulate hw without byte enables: no RMW
833 e1000_mmio_writel(opaque, addr & ~3,
6b59fc74 834 (val & 0xffff) << (8*(addr & 3)));
7c23b892
AZ
835}
836
837static void
838e1000_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
839{
840 // emulate hw without byte enables: no RMW
841 e1000_mmio_writel(opaque, addr & ~3,
6b59fc74 842 (val & 0xff) << (8*(addr & 3)));
7c23b892
AZ
843}
844
845static uint32_t
846e1000_mmio_readl(void *opaque, target_phys_addr_t addr)
847{
848 E1000State *s = opaque;
8da3ff18 849 unsigned int index = (addr & 0x1ffff) >> 2;
7c23b892
AZ
850
851 if (index < NREADOPS && macreg_readops[index])
6b59fc74
AJ
852 {
853 uint32_t val = macreg_readops[index](s, index);
854#ifdef TARGET_WORDS_BIGENDIAN
855 val = bswap32(val);
856#endif
857 return val;
858 }
7c23b892
AZ
859 DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
860 return 0;
861}
862
863static uint32_t
864e1000_mmio_readb(void *opaque, target_phys_addr_t addr)
865{
6b59fc74 866 return ((e1000_mmio_readl(opaque, addr & ~3)) >>
7c23b892
AZ
867 (8 * (addr & 3))) & 0xff;
868}
869
870static uint32_t
871e1000_mmio_readw(void *opaque, target_phys_addr_t addr)
872{
6b59fc74
AJ
873 return ((e1000_mmio_readl(opaque, addr & ~3)) >>
874 (8 * (addr & 3))) & 0xffff;
7c23b892
AZ
875}
876
88b4e9db 877static const int mac_regtosave[] = {
7c23b892
AZ
878 CTRL, EECD, EERD, GPRC, GPTC, ICR, ICS, IMC, IMS,
879 LEDCTL, MANC, MDIC, MPC, PBA, RCTL, RDBAH, RDBAL, RDH,
880 RDLEN, RDT, STATUS, SWSM, TCTL, TDBAH, TDBAL, TDH, TDLEN,
881 TDT, TORH, TORL, TOTH, TOTL, TPR, TPT, TXDCTL, WUFC,
8f2e8d1f 882 VET,
7c23b892 883};
b1503cda 884enum { MAC_NSAVE = ARRAY_SIZE(mac_regtosave) };
7c23b892 885
88b4e9db 886static const struct {
7c23b892
AZ
887 int size;
888 int array0;
8f2e8d1f 889} mac_regarraystosave[] = { {32, RA}, {128, MTA}, {128, VFTA} };
b1503cda 890enum { MAC_NARRAYS = ARRAY_SIZE(mac_regarraystosave) };
7c23b892
AZ
891
892static void
893nic_save(QEMUFile *f, void *opaque)
894{
895 E1000State *s = (E1000State *)opaque;
896 int i, j;
897
898 pci_device_save(&s->dev, f);
8da3ff18 899 qemu_put_be32(f, 0);
7c23b892
AZ
900 qemu_put_be32s(f, &s->rxbuf_size);
901 qemu_put_be32s(f, &s->rxbuf_min_shift);
902 qemu_put_be32s(f, &s->eecd_state.val_in);
903 qemu_put_be16s(f, &s->eecd_state.bitnum_in);
904 qemu_put_be16s(f, &s->eecd_state.bitnum_out);
905 qemu_put_be16s(f, &s->eecd_state.reading);
906 qemu_put_be32s(f, &s->eecd_state.old_eecd);
907 qemu_put_8s(f, &s->tx.ipcss);
908 qemu_put_8s(f, &s->tx.ipcso);
909 qemu_put_be16s(f, &s->tx.ipcse);
910 qemu_put_8s(f, &s->tx.tucss);
911 qemu_put_8s(f, &s->tx.tucso);
912 qemu_put_be16s(f, &s->tx.tucse);
913 qemu_put_be32s(f, &s->tx.paylen);
914 qemu_put_8s(f, &s->tx.hdr_len);
915 qemu_put_be16s(f, &s->tx.mss);
916 qemu_put_be16s(f, &s->tx.size);
917 qemu_put_be16s(f, &s->tx.tso_frames);
918 qemu_put_8s(f, &s->tx.sum_needed);
b6c4f71f
BS
919 qemu_put_s8s(f, &s->tx.ip);
920 qemu_put_s8s(f, &s->tx.tcp);
7c23b892
AZ
921 qemu_put_buffer(f, s->tx.header, sizeof s->tx.header);
922 qemu_put_buffer(f, s->tx.data, sizeof s->tx.data);
923 for (i = 0; i < 64; i++)
924 qemu_put_be16s(f, s->eeprom_data + i);
925 for (i = 0; i < 0x20; i++)
926 qemu_put_be16s(f, s->phy_reg + i);
927 for (i = 0; i < MAC_NSAVE; i++)
928 qemu_put_be32s(f, s->mac_reg + mac_regtosave[i]);
929 for (i = 0; i < MAC_NARRAYS; i++)
930 for (j = 0; j < mac_regarraystosave[i].size; j++)
931 qemu_put_be32s(f,
932 s->mac_reg + mac_regarraystosave[i].array0 + j);
933}
934
935static int
936nic_load(QEMUFile *f, void *opaque, int version_id)
937{
938 E1000State *s = (E1000State *)opaque;
939 int i, j, ret;
940
941 if ((ret = pci_device_load(&s->dev, f)) < 0)
942 return ret;
18fdb1c5 943 if (version_id == 1)
b6c4f71f 944 qemu_get_sbe32s(f, &i); /* once some unused instance id */
8da3ff18 945 qemu_get_be32(f); /* Ignored. Was mmio_base. */
7c23b892
AZ
946 qemu_get_be32s(f, &s->rxbuf_size);
947 qemu_get_be32s(f, &s->rxbuf_min_shift);
948 qemu_get_be32s(f, &s->eecd_state.val_in);
949 qemu_get_be16s(f, &s->eecd_state.bitnum_in);
950 qemu_get_be16s(f, &s->eecd_state.bitnum_out);
951 qemu_get_be16s(f, &s->eecd_state.reading);
952 qemu_get_be32s(f, &s->eecd_state.old_eecd);
953 qemu_get_8s(f, &s->tx.ipcss);
954 qemu_get_8s(f, &s->tx.ipcso);
955 qemu_get_be16s(f, &s->tx.ipcse);
956 qemu_get_8s(f, &s->tx.tucss);
957 qemu_get_8s(f, &s->tx.tucso);
958 qemu_get_be16s(f, &s->tx.tucse);
959 qemu_get_be32s(f, &s->tx.paylen);
960 qemu_get_8s(f, &s->tx.hdr_len);
961 qemu_get_be16s(f, &s->tx.mss);
962 qemu_get_be16s(f, &s->tx.size);
963 qemu_get_be16s(f, &s->tx.tso_frames);
964 qemu_get_8s(f, &s->tx.sum_needed);
b6c4f71f
BS
965 qemu_get_s8s(f, &s->tx.ip);
966 qemu_get_s8s(f, &s->tx.tcp);
7c23b892
AZ
967 qemu_get_buffer(f, s->tx.header, sizeof s->tx.header);
968 qemu_get_buffer(f, s->tx.data, sizeof s->tx.data);
969 for (i = 0; i < 64; i++)
970 qemu_get_be16s(f, s->eeprom_data + i);
971 for (i = 0; i < 0x20; i++)
972 qemu_get_be16s(f, s->phy_reg + i);
973 for (i = 0; i < MAC_NSAVE; i++)
974 qemu_get_be32s(f, s->mac_reg + mac_regtosave[i]);
975 for (i = 0; i < MAC_NARRAYS; i++)
976 for (j = 0; j < mac_regarraystosave[i].size; j++)
977 qemu_get_be32s(f,
978 s->mac_reg + mac_regarraystosave[i].array0 + j);
979 return 0;
980}
981
88b4e9db 982static const uint16_t e1000_eeprom_template[64] = {
7c23b892
AZ
983 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
984 0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
985 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
986 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
987 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
988 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
989 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
990 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
991};
992
88b4e9db 993static const uint16_t phy_reg_init[] = {
7c23b892
AZ
994 [PHY_CTRL] = 0x1140, [PHY_STATUS] = 0x796d, // link initially up
995 [PHY_ID1] = 0x141, [PHY_ID2] = PHY_ID2_INIT,
996 [PHY_1000T_CTRL] = 0x0e00, [M88E1000_PHY_SPEC_CTRL] = 0x360,
997 [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60, [PHY_AUTONEG_ADV] = 0xde1,
998 [PHY_LP_ABILITY] = 0x1e0, [PHY_1000T_STATUS] = 0x3c00,
700f6e2c 999 [M88E1000_PHY_SPEC_STATUS] = 0xac00,
7c23b892
AZ
1000};
1001
88b4e9db 1002static const uint32_t mac_reg_init[] = {
7c23b892
AZ
1003 [PBA] = 0x00100030,
1004 [LEDCTL] = 0x602,
1005 [CTRL] = E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
1006 E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
1007 [STATUS] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
1008 E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
1009 E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
1010 E1000_STATUS_LU,
1011 [MANC] = E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
1012 E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
1013 E1000_MANC_RMCP_EN,
1014};
1015
1016/* PCI interface */
1017
1018static CPUWriteMemoryFunc *e1000_mmio_write[] = {
1019 e1000_mmio_writeb, e1000_mmio_writew, e1000_mmio_writel
1020};
1021
1022static CPUReadMemoryFunc *e1000_mmio_read[] = {
1023 e1000_mmio_readb, e1000_mmio_readw, e1000_mmio_readl
1024};
1025
1026static void
1027e1000_mmio_map(PCIDevice *pci_dev, int region_num,
1028 uint32_t addr, uint32_t size, int type)
1029{
1030 E1000State *d = (E1000State *)pci_dev;
f65ed4c1
AL
1031 int i;
1032 const uint32_t excluded_regs[] = {
1033 E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
1034 E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
1035 };
1036
7c23b892
AZ
1037
1038 DBGOUT(MMIO, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr, size);
1039
7c23b892 1040 cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index);
f65ed4c1
AL
1041 qemu_register_coalesced_mmio(addr, excluded_regs[0]);
1042
1043 for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
1044 qemu_register_coalesced_mmio(addr + excluded_regs[i] + 4,
1045 excluded_regs[i + 1] -
1046 excluded_regs[i] - 4);
7c23b892
AZ
1047}
1048
b946a153
AL
1049static void
1050e1000_cleanup(VLANClientState *vc)
1051{
1052 E1000State *d = vc->opaque;
1053
1054 unregister_savevm("e1000", d);
1055}
1056
4b09be85
AL
1057static int
1058pci_e1000_uninit(PCIDevice *dev)
1059{
1060 E1000State *d = (E1000State *) dev;
1061
1062 cpu_unregister_io_memory(d->mmio_index);
1063
1064 return 0;
1065}
1066
32c86e95
BS
1067static void e1000_reset(void *opaque)
1068{
1069 E1000State *d = opaque;
1070
1071 memset(d->phy_reg, 0, sizeof d->phy_reg);
1072 memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
1073 memset(d->mac_reg, 0, sizeof d->mac_reg);
1074 memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
1075 d->rxbuf_min_shift = 1;
1076 memset(&d->tx, 0, sizeof d->tx);
1077}
1078
9d07d757 1079static void pci_e1000_init(PCIDevice *pci_dev)
7c23b892 1080{
9d07d757 1081 E1000State *d = (E1000State *)pci_dev;
7c23b892 1082 uint8_t *pci_conf;
7c23b892 1083 uint16_t checksum = 0;
7ccfb2eb 1084 static const char info_str[] = "e1000";
7c23b892 1085 int i;
9d07d757 1086 uint8_t macaddr[6];
aff427a1 1087
7c23b892 1088 pci_conf = d->dev.config;
7c23b892 1089
deb54399
AL
1090 pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1091 pci_config_set_device_id(pci_conf, E1000_DEVID);
7c23b892
AZ
1092 *(uint16_t *)(pci_conf+0x04) = cpu_to_le16(0x0407);
1093 *(uint16_t *)(pci_conf+0x06) = cpu_to_le16(0x0010);
1094 pci_conf[0x08] = 0x03;
173a543b 1095 pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
7c23b892
AZ
1096 pci_conf[0x0c] = 0x10;
1097
1098 pci_conf[0x3d] = 1; // interrupt pin 0
1099
1eed09cb 1100 d->mmio_index = cpu_register_io_memory(e1000_mmio_read,
7c23b892
AZ
1101 e1000_mmio_write, d);
1102
28c2c264 1103 pci_register_bar((PCIDevice *)d, 0, PNPMMIO_SIZE,
7c23b892
AZ
1104 PCI_ADDRESS_SPACE_MEM, e1000_mmio_map);
1105
28c2c264 1106 pci_register_bar((PCIDevice *)d, 1, IOPORT_SIZE,
7c23b892
AZ
1107 PCI_ADDRESS_SPACE_IO, ioport_map);
1108
7c23b892
AZ
1109 memmove(d->eeprom_data, e1000_eeprom_template,
1110 sizeof e1000_eeprom_template);
9d07d757 1111 qdev_get_macaddr(&d->dev.qdev, macaddr);
7c23b892 1112 for (i = 0; i < 3; i++)
9d07d757 1113 d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
7c23b892
AZ
1114 for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1115 checksum += d->eeprom_data[i];
1116 checksum = (uint16_t) EEPROM_SUM - checksum;
1117 d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
1118
9d07d757 1119 d->vc = qdev_get_vlan_client(&d->dev.qdev,
463af534
MM
1120 e1000_can_receive, e1000_receive,
1121 NULL, e1000_cleanup, d);
99ed7e30 1122 d->vc->link_status_changed = e1000_set_link_status;
7c23b892 1123
9d07d757 1124 qemu_format_nic_info_str(d->vc, macaddr);
7c23b892 1125
18fdb1c5 1126 register_savevm(info_str, -1, 2, nic_save, nic_load, d);
4b09be85 1127 d->dev.unregister = pci_e1000_uninit;
a08d4367 1128 qemu_register_reset(e1000_reset, d);
32c86e95 1129 e1000_reset(d);
9d07d757 1130}
72da4208 1131
0aab0d3a
GH
1132static PCIDeviceInfo e1000_info = {
1133 .qdev.name = "e1000",
1134 .qdev.size = sizeof(E1000State),
1135 .init = pci_e1000_init,
1136};
1137
9d07d757
PB
1138static void e1000_register_devices(void)
1139{
0aab0d3a 1140 pci_qdev_register(&e1000_info);
7c23b892 1141}
9d07d757
PB
1142
1143device_init(e1000_register_devices)