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