4 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
5 * Copyright (c) 2008 Qumranet
6 * Based on work done by:
7 * Copyright (c) 2007 Dan Aloni
8 * Copyright (c) 2004 Antony T Curtis
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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
,
41 #define DBGBIT(x) (1<<DEBUG_##x)
42 static int debugflags
= DBGBIT(TXERR
) | DBGBIT(GENERAL
);
44 #define DBGOUT(what, fmt, params...) do { \
45 if (debugflags & DBGBIT(what)) \
46 fprintf(stderr, "e1000: " fmt, ##params); \
49 #define DBGOUT(what, fmt, params...) do {} while (0)
52 #define IOPORT_SIZE 0x40
53 #define PNPMMIO_SIZE 0x20000
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
63 enum { E1000_DEVID
= E1000_DEV_ID_82540EM
};
66 * May need to specify additional MAC-to-PHY entries --
67 * Intel's Windows driver refuses to initialize unless they match
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
75 typedef struct E1000State_st
{
82 uint32_t mac_reg
[0x8000];
83 uint16_t phy_reg
[0x20];
84 uint16_t eeprom_data
[64];
87 uint32_t rxbuf_min_shift
;
90 unsigned char header
[256];
91 unsigned char vlan_header
[4];
92 unsigned char vlan
[4];
93 unsigned char data
[0x10000];
95 unsigned char sum_needed
;
96 unsigned char vlan_needed
;
110 char cptse
; // current packet tse bit
114 uint32_t val_in
; // shifted in from guest driver
122 #define defreg(x) x = (E1000_##x>>2)
124 defreg(CTRL
), defreg(EECD
), defreg(EERD
), defreg(GPRC
),
125 defreg(GPTC
), defreg(ICR
), defreg(ICS
), defreg(IMC
),
126 defreg(IMS
), defreg(LEDCTL
), defreg(MANC
), defreg(MDIC
),
127 defreg(MPC
), defreg(PBA
), defreg(RCTL
), defreg(RDBAH
),
128 defreg(RDBAL
), defreg(RDH
), defreg(RDLEN
), defreg(RDT
),
129 defreg(STATUS
), defreg(SWSM
), defreg(TCTL
), defreg(TDBAH
),
130 defreg(TDBAL
), defreg(TDH
), defreg(TDLEN
), defreg(TDT
),
131 defreg(TORH
), defreg(TORL
), defreg(TOTH
), defreg(TOTL
),
132 defreg(TPR
), defreg(TPT
), defreg(TXDCTL
), defreg(WUFC
),
133 defreg(RA
), defreg(MTA
), defreg(CRCERRS
),defreg(VFTA
),
137 enum { PHY_R
= 1, PHY_W
= 2, PHY_RW
= PHY_R
| PHY_W
};
138 static const char phy_regcap
[0x20] = {
139 [PHY_STATUS
] = PHY_R
, [M88E1000_EXT_PHY_SPEC_CTRL
] = PHY_RW
,
140 [PHY_ID1
] = PHY_R
, [M88E1000_PHY_SPEC_CTRL
] = PHY_RW
,
141 [PHY_CTRL
] = PHY_RW
, [PHY_1000T_CTRL
] = PHY_RW
,
142 [PHY_LP_ABILITY
] = PHY_R
, [PHY_1000T_STATUS
] = PHY_R
,
143 [PHY_AUTONEG_ADV
] = PHY_RW
, [M88E1000_RX_ERR_CNTR
] = PHY_R
,
144 [PHY_ID2
] = PHY_R
, [M88E1000_PHY_SPEC_STATUS
] = PHY_R
148 ioport_map(PCIDevice
*pci_dev
, int region_num
, uint32_t addr
,
149 uint32_t size
, int type
)
151 DBGOUT(IO
, "e1000_ioport_map addr=0x%04x size=0x%08x\n", addr
, size
);
155 set_interrupt_cause(E1000State
*s
, int index
, uint32_t val
)
158 val
|= E1000_ICR_INT_ASSERTED
;
159 s
->mac_reg
[ICR
] = val
;
160 qemu_set_irq(s
->dev
.irq
[0], (s
->mac_reg
[IMS
] & s
->mac_reg
[ICR
]) != 0);
164 set_ics(E1000State
*s
, int index
, uint32_t val
)
166 DBGOUT(INTERRUPT
, "set_ics %x, ICR %x, IMR %x\n", val
, s
->mac_reg
[ICR
],
168 set_interrupt_cause(s
, 0, val
| s
->mac_reg
[ICR
]);
172 rxbufsize(uint32_t v
)
174 v
&= E1000_RCTL_BSEX
| E1000_RCTL_SZ_16384
| E1000_RCTL_SZ_8192
|
175 E1000_RCTL_SZ_4096
| E1000_RCTL_SZ_2048
| E1000_RCTL_SZ_1024
|
176 E1000_RCTL_SZ_512
| E1000_RCTL_SZ_256
;
178 case E1000_RCTL_BSEX
| E1000_RCTL_SZ_16384
:
180 case E1000_RCTL_BSEX
| E1000_RCTL_SZ_8192
:
182 case E1000_RCTL_BSEX
| E1000_RCTL_SZ_4096
:
184 case E1000_RCTL_SZ_1024
:
186 case E1000_RCTL_SZ_512
:
188 case E1000_RCTL_SZ_256
:
195 set_rx_control(E1000State
*s
, int index
, uint32_t val
)
197 s
->mac_reg
[RCTL
] = val
;
198 s
->rxbuf_size
= rxbufsize(val
);
199 s
->rxbuf_min_shift
= ((val
/ E1000_RCTL_RDMTS_QUAT
) & 3) + 1;
200 DBGOUT(RX
, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s
->mac_reg
[RDT
],
205 set_mdic(E1000State
*s
, int index
, uint32_t val
)
207 uint32_t data
= val
& E1000_MDIC_DATA_MASK
;
208 uint32_t addr
= ((val
& E1000_MDIC_REG_MASK
) >> E1000_MDIC_REG_SHIFT
);
210 if ((val
& E1000_MDIC_PHY_MASK
) >> E1000_MDIC_PHY_SHIFT
!= 1) // phy #
211 val
= s
->mac_reg
[MDIC
] | E1000_MDIC_ERROR
;
212 else if (val
& E1000_MDIC_OP_READ
) {
213 DBGOUT(MDIC
, "MDIC read reg 0x%x\n", addr
);
214 if (!(phy_regcap
[addr
] & PHY_R
)) {
215 DBGOUT(MDIC
, "MDIC read reg %x unhandled\n", addr
);
216 val
|= E1000_MDIC_ERROR
;
218 val
= (val
^ data
) | s
->phy_reg
[addr
];
219 } else if (val
& E1000_MDIC_OP_WRITE
) {
220 DBGOUT(MDIC
, "MDIC write reg 0x%x, value 0x%x\n", addr
, data
);
221 if (!(phy_regcap
[addr
] & PHY_W
)) {
222 DBGOUT(MDIC
, "MDIC write reg %x unhandled\n", addr
);
223 val
|= E1000_MDIC_ERROR
;
225 s
->phy_reg
[addr
] = data
;
227 s
->mac_reg
[MDIC
] = val
| E1000_MDIC_READY
;
228 set_ics(s
, 0, E1000_ICR_MDAC
);
232 get_eecd(E1000State
*s
, int index
)
234 uint32_t ret
= E1000_EECD_PRES
|E1000_EECD_GNT
| s
->eecd_state
.old_eecd
;
236 DBGOUT(EEPROM
, "reading eeprom bit %d (reading %d)\n",
237 s
->eecd_state
.bitnum_out
, s
->eecd_state
.reading
);
238 if (!s
->eecd_state
.reading
||
239 ((s
->eeprom_data
[(s
->eecd_state
.bitnum_out
>> 4) & 0x3f] >>
240 ((s
->eecd_state
.bitnum_out
& 0xf) ^ 0xf))) & 1)
241 ret
|= E1000_EECD_DO
;
246 set_eecd(E1000State
*s
, int index
, uint32_t val
)
248 uint32_t oldval
= s
->eecd_state
.old_eecd
;
250 s
->eecd_state
.old_eecd
= val
& (E1000_EECD_SK
| E1000_EECD_CS
|
251 E1000_EECD_DI
|E1000_EECD_FWE_MASK
|E1000_EECD_REQ
);
252 if (!(E1000_EECD_SK
& (val
^ oldval
))) // no clock edge
254 if (!(E1000_EECD_SK
& val
)) { // falling edge
255 s
->eecd_state
.bitnum_out
++;
258 if (!(val
& E1000_EECD_CS
)) { // rising, no CS (EEPROM reset)
259 memset(&s
->eecd_state
, 0, sizeof s
->eecd_state
);
262 s
->eecd_state
.val_in
<<= 1;
263 if (val
& E1000_EECD_DI
)
264 s
->eecd_state
.val_in
|= 1;
265 if (++s
->eecd_state
.bitnum_in
== 9 && !s
->eecd_state
.reading
) {
266 s
->eecd_state
.bitnum_out
= ((s
->eecd_state
.val_in
& 0x3f)<<4)-1;
267 s
->eecd_state
.reading
= (((s
->eecd_state
.val_in
>> 6) & 7) ==
268 EEPROM_READ_OPCODE_MICROWIRE
);
270 DBGOUT(EEPROM
, "eeprom bitnum in %d out %d, reading %d\n",
271 s
->eecd_state
.bitnum_in
, s
->eecd_state
.bitnum_out
,
272 s
->eecd_state
.reading
);
276 flash_eerd_read(E1000State
*s
, int x
)
278 unsigned int index
, r
= s
->mac_reg
[EERD
] & ~E1000_EEPROM_RW_REG_START
;
280 if ((index
= r
>> E1000_EEPROM_RW_ADDR_SHIFT
) > EEPROM_CHECKSUM_REG
)
282 return (s
->eeprom_data
[index
] << E1000_EEPROM_RW_REG_DATA
) |
283 E1000_EEPROM_RW_REG_DONE
| r
;
287 putsum(uint8_t *data
, uint32_t n
, uint32_t sloc
, uint32_t css
, uint32_t cse
)
294 sum
= net_checksum_add(n
-css
, data
+css
);
295 cpu_to_be16wu((uint16_t *)(data
+ sloc
),
296 net_checksum_finish(sum
));
301 vlan_enabled(E1000State
*s
)
303 return ((s
->mac_reg
[CTRL
] & E1000_CTRL_VME
) != 0);
307 vlan_rx_filter_enabled(E1000State
*s
)
309 return ((s
->mac_reg
[RCTL
] & E1000_RCTL_VFE
) != 0);
313 is_vlan_packet(E1000State
*s
, const uint8_t *buf
)
315 return (be16_to_cpup((uint16_t *)(buf
+ 12)) ==
316 le16_to_cpup((uint16_t *)(s
->mac_reg
+ VET
)));
320 is_vlan_txd(uint32_t txd_lower
)
322 return ((txd_lower
& E1000_TXD_CMD_VLE
) != 0);
326 xmit_seg(E1000State
*s
)
329 unsigned int frames
= s
->tx
.tso_frames
, css
, sofar
, n
;
330 struct e1000_tx
*tp
= &s
->tx
;
332 if (tp
->tse
&& tp
->cptse
) {
334 DBGOUT(TXSUM
, "frames %d size %d ipcss %d\n",
335 frames
, tp
->size
, css
);
336 if (tp
->ip
) { // IPv4
337 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+2),
339 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+4),
340 be16_to_cpup((uint16_t *)(tp
->data
+css
+4))+frames
);
342 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+4),
345 len
= tp
->size
- css
;
346 DBGOUT(TXSUM
, "tcp %d tucss %d len %d\n", tp
->tcp
, css
, len
);
348 sofar
= frames
* tp
->mss
;
349 cpu_to_be32wu((uint32_t *)(tp
->data
+css
+4), // seq
350 be32_to_cpupu((uint32_t *)(tp
->data
+css
+4))+sofar
);
351 if (tp
->paylen
- sofar
> tp
->mss
)
352 tp
->data
[css
+ 13] &= ~9; // PSH, FIN
354 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+4), len
);
355 if (tp
->sum_needed
& E1000_TXD_POPTS_TXSM
) {
356 // add pseudo-header length before checksum calculation
357 sp
= (uint16_t *)(tp
->data
+ tp
->tucso
);
358 cpu_to_be16wu(sp
, be16_to_cpup(sp
) + len
);
363 if (tp
->sum_needed
& E1000_TXD_POPTS_TXSM
)
364 putsum(tp
->data
, tp
->size
, tp
->tucso
, tp
->tucss
, tp
->tucse
);
365 if (tp
->sum_needed
& E1000_TXD_POPTS_IXSM
)
366 putsum(tp
->data
, tp
->size
, tp
->ipcso
, tp
->ipcss
, tp
->ipcse
);
367 if (tp
->vlan_needed
) {
368 memmove(tp
->vlan
, tp
->data
, 12);
369 memcpy(tp
->data
+ 8, tp
->vlan_header
, 4);
370 qemu_send_packet(s
->vc
, tp
->vlan
, tp
->size
+ 4);
372 qemu_send_packet(s
->vc
, tp
->data
, tp
->size
);
375 n
= s
->mac_reg
[TOTL
];
376 if ((s
->mac_reg
[TOTL
] += s
->tx
.size
) < n
)
381 process_tx_desc(E1000State
*s
, struct e1000_tx_desc
*dp
)
383 uint32_t txd_lower
= le32_to_cpu(dp
->lower
.data
);
384 uint32_t dtype
= txd_lower
& (E1000_TXD_CMD_DEXT
| E1000_TXD_DTYP_D
);
385 unsigned int split_size
= txd_lower
& 0xffff, bytes
, sz
, op
;
386 unsigned int msh
= 0xfffff, hdr
= 0;
388 struct e1000_context_desc
*xp
= (struct e1000_context_desc
*)dp
;
389 struct e1000_tx
*tp
= &s
->tx
;
391 if (dtype
== E1000_TXD_CMD_DEXT
) { // context descriptor
392 op
= le32_to_cpu(xp
->cmd_and_length
);
393 tp
->ipcss
= xp
->lower_setup
.ip_fields
.ipcss
;
394 tp
->ipcso
= xp
->lower_setup
.ip_fields
.ipcso
;
395 tp
->ipcse
= le16_to_cpu(xp
->lower_setup
.ip_fields
.ipcse
);
396 tp
->tucss
= xp
->upper_setup
.tcp_fields
.tucss
;
397 tp
->tucso
= xp
->upper_setup
.tcp_fields
.tucso
;
398 tp
->tucse
= le16_to_cpu(xp
->upper_setup
.tcp_fields
.tucse
);
399 tp
->paylen
= op
& 0xfffff;
400 tp
->hdr_len
= xp
->tcp_seg_setup
.fields
.hdr_len
;
401 tp
->mss
= le16_to_cpu(xp
->tcp_seg_setup
.fields
.mss
);
402 tp
->ip
= (op
& E1000_TXD_CMD_IP
) ? 1 : 0;
403 tp
->tcp
= (op
& E1000_TXD_CMD_TCP
) ? 1 : 0;
404 tp
->tse
= (op
& E1000_TXD_CMD_TSE
) ? 1 : 0;
406 if (tp
->tucso
== 0) { // this is probably wrong
407 DBGOUT(TXSUM
, "TCP/UDP: cso 0!\n");
408 tp
->tucso
= tp
->tucss
+ (tp
->tcp
? 16 : 6);
411 } else if (dtype
== (E1000_TXD_CMD_DEXT
| E1000_TXD_DTYP_D
)) {
413 tp
->sum_needed
= le32_to_cpu(dp
->upper
.data
) >> 8;
414 tp
->cptse
= ( txd_lower
& E1000_TXD_CMD_TSE
) ? 1 : 0;
419 if (vlan_enabled(s
) && is_vlan_txd(txd_lower
) &&
420 (tp
->cptse
|| txd_lower
& E1000_TXD_CMD_EOP
)) {
422 cpu_to_be16wu((uint16_t *)(tp
->vlan_header
),
423 le16_to_cpup((uint16_t *)(s
->mac_reg
+ VET
)));
424 cpu_to_be16wu((uint16_t *)(tp
->vlan_header
+ 2),
425 le16_to_cpu(dp
->upper
.fields
.special
));
428 addr
= le64_to_cpu(dp
->buffer_addr
);
429 if (tp
->tse
&& tp
->cptse
) {
434 if (tp
->size
+ bytes
> msh
)
435 bytes
= msh
- tp
->size
;
436 cpu_physical_memory_read(addr
, tp
->data
+ tp
->size
, bytes
);
437 if ((sz
= tp
->size
+ bytes
) >= hdr
&& tp
->size
< hdr
)
438 memmove(tp
->header
, tp
->data
, hdr
);
443 memmove(tp
->data
, tp
->header
, hdr
);
446 } while (split_size
-= bytes
);
447 } else if (!tp
->tse
&& tp
->cptse
) {
448 // context descriptor TSE is not set, while data descriptor TSE is set
449 DBGOUT(TXERR
, "TCP segmentaion Error\n");
451 cpu_physical_memory_read(addr
, tp
->data
+ tp
->size
, split_size
);
452 tp
->size
+= split_size
;
455 if (!(txd_lower
& E1000_TXD_CMD_EOP
))
457 if (!(tp
->tse
&& tp
->cptse
&& tp
->size
< hdr
))
467 txdesc_writeback(target_phys_addr_t base
, struct e1000_tx_desc
*dp
)
469 uint32_t txd_upper
, txd_lower
= le32_to_cpu(dp
->lower
.data
);
471 if (!(txd_lower
& (E1000_TXD_CMD_RS
|E1000_TXD_CMD_RPS
)))
473 txd_upper
= (le32_to_cpu(dp
->upper
.data
) | E1000_TXD_STAT_DD
) &
474 ~(E1000_TXD_STAT_EC
| E1000_TXD_STAT_LC
| E1000_TXD_STAT_TU
);
475 dp
->upper
.data
= cpu_to_le32(txd_upper
);
476 cpu_physical_memory_write(base
+ ((char *)&dp
->upper
- (char *)dp
),
477 (void *)&dp
->upper
, sizeof(dp
->upper
));
478 return E1000_ICR_TXDW
;
482 start_xmit(E1000State
*s
)
484 target_phys_addr_t base
;
485 struct e1000_tx_desc desc
;
486 uint32_t tdh_start
= s
->mac_reg
[TDH
], cause
= E1000_ICS_TXQE
;
488 if (!(s
->mac_reg
[TCTL
] & E1000_TCTL_EN
)) {
489 DBGOUT(TX
, "tx disabled\n");
493 while (s
->mac_reg
[TDH
] != s
->mac_reg
[TDT
]) {
494 base
= ((uint64_t)s
->mac_reg
[TDBAH
] << 32) + s
->mac_reg
[TDBAL
] +
495 sizeof(struct e1000_tx_desc
) * s
->mac_reg
[TDH
];
496 cpu_physical_memory_read(base
, (void *)&desc
, sizeof(desc
));
498 DBGOUT(TX
, "index %d: %p : %x %x\n", s
->mac_reg
[TDH
],
499 (void *)(intptr_t)desc
.buffer_addr
, desc
.lower
.data
,
502 process_tx_desc(s
, &desc
);
503 cause
|= txdesc_writeback(base
, &desc
);
505 if (++s
->mac_reg
[TDH
] * sizeof(desc
) >= s
->mac_reg
[TDLEN
])
508 * the following could happen only if guest sw assigns
509 * bogus values to TDT/TDLEN.
510 * there's nothing too intelligent we could do about this.
512 if (s
->mac_reg
[TDH
] == tdh_start
) {
513 DBGOUT(TXERR
, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
514 tdh_start
, s
->mac_reg
[TDT
], s
->mac_reg
[TDLEN
]);
518 set_ics(s
, 0, cause
);
522 receive_filter(E1000State
*s
, const uint8_t *buf
, int size
)
524 static uint8_t bcast
[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
525 static int mta_shift
[] = {4, 3, 2, 0};
526 uint32_t f
, rctl
= s
->mac_reg
[RCTL
], ra
[2], *rp
;
528 if (is_vlan_packet(s
, buf
) && vlan_rx_filter_enabled(s
)) {
529 uint16_t vid
= be16_to_cpup((uint16_t *)(buf
+ 14));
530 uint32_t vfta
= le32_to_cpup((uint32_t *)(s
->mac_reg
+ VFTA
) +
531 ((vid
>> 5) & 0x7f));
532 if ((vfta
& (1 << (vid
& 0x1f))) == 0)
536 if (rctl
& E1000_RCTL_UPE
) // promiscuous
539 if ((buf
[0] & 1) && (rctl
& E1000_RCTL_MPE
)) // promiscuous mcast
542 if ((rctl
& E1000_RCTL_BAM
) && !memcmp(buf
, bcast
, sizeof bcast
))
545 for (rp
= s
->mac_reg
+ RA
; rp
< s
->mac_reg
+ RA
+ 32; rp
+= 2) {
546 if (!(rp
[1] & E1000_RAH_AV
))
548 ra
[0] = cpu_to_le32(rp
[0]);
549 ra
[1] = cpu_to_le32(rp
[1]);
550 if (!memcmp(buf
, (uint8_t *)ra
, 6)) {
552 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
553 (int)(rp
- s
->mac_reg
- RA
)/2,
554 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5]);
558 DBGOUT(RXFILTER
, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
559 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5]);
561 f
= mta_shift
[(rctl
>> E1000_RCTL_MO_SHIFT
) & 3];
562 f
= (((buf
[5] << 8) | buf
[4]) >> f
) & 0xfff;
563 if (s
->mac_reg
[MTA
+ (f
>> 5)] & (1 << (f
& 0x1f)))
566 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
567 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5],
568 (rctl
>> E1000_RCTL_MO_SHIFT
) & 3, f
>> 5,
569 s
->mac_reg
[MTA
+ (f
>> 5)]);
575 e1000_can_receive(void *opaque
)
577 E1000State
*s
= opaque
;
579 return (s
->mac_reg
[RCTL
] & E1000_RCTL_EN
);
583 e1000_receive(void *opaque
, const uint8_t *buf
, int size
)
585 E1000State
*s
= opaque
;
586 struct e1000_rx_desc desc
;
587 target_phys_addr_t base
;
590 uint16_t vlan_special
= 0;
591 uint8_t vlan_status
= 0, vlan_offset
= 0;
593 if (!(s
->mac_reg
[RCTL
] & E1000_RCTL_EN
))
596 if (size
> s
->rxbuf_size
) {
597 DBGOUT(RX
, "packet too large for buffers (%d > %d)\n", size
,
602 if (!receive_filter(s
, buf
, size
))
605 if (vlan_enabled(s
) && is_vlan_packet(s
, buf
)) {
606 vlan_special
= cpu_to_le16(be16_to_cpup((uint16_t *)(buf
+ 14)));
607 memmove((void *)(buf
+ 4), buf
, 12);
608 vlan_status
= E1000_RXD_STAT_VP
;
613 rdh_start
= s
->mac_reg
[RDH
];
614 size
+= 4; // for the header
616 if (s
->mac_reg
[RDH
] == s
->mac_reg
[RDT
] && s
->check_rxov
) {
617 set_ics(s
, 0, E1000_ICS_RXO
);
620 base
= ((uint64_t)s
->mac_reg
[RDBAH
] << 32) + s
->mac_reg
[RDBAL
] +
621 sizeof(desc
) * s
->mac_reg
[RDH
];
622 cpu_physical_memory_read(base
, (void *)&desc
, sizeof(desc
));
623 desc
.special
= vlan_special
;
624 desc
.status
|= (vlan_status
| E1000_RXD_STAT_DD
);
625 if (desc
.buffer_addr
) {
626 cpu_physical_memory_write(le64_to_cpu(desc
.buffer_addr
),
627 (void *)(buf
+ vlan_offset
), size
);
628 desc
.length
= cpu_to_le16(size
);
629 desc
.status
|= E1000_RXD_STAT_EOP
|E1000_RXD_STAT_IXSM
;
630 } else // as per intel docs; skip descriptors with null buf addr
631 DBGOUT(RX
, "Null RX descriptor!!\n");
632 cpu_physical_memory_write(base
, (void *)&desc
, sizeof(desc
));
634 if (++s
->mac_reg
[RDH
] * sizeof(desc
) >= s
->mac_reg
[RDLEN
])
637 /* see comment in start_xmit; same here */
638 if (s
->mac_reg
[RDH
] == rdh_start
) {
639 DBGOUT(RXERR
, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
640 rdh_start
, s
->mac_reg
[RDT
], s
->mac_reg
[RDLEN
]);
641 set_ics(s
, 0, E1000_ICS_RXO
);
644 } while (desc
.buffer_addr
== 0);
648 n
= s
->mac_reg
[TORL
];
649 if ((s
->mac_reg
[TORL
] += size
) < n
)
653 if ((rdt
= s
->mac_reg
[RDT
]) < s
->mac_reg
[RDH
])
654 rdt
+= s
->mac_reg
[RDLEN
] / sizeof(desc
);
655 if (((rdt
- s
->mac_reg
[RDH
]) * sizeof(desc
)) << s
->rxbuf_min_shift
>=
657 n
|= E1000_ICS_RXDMT0
;
663 mac_readreg(E1000State
*s
, int index
)
665 return s
->mac_reg
[index
];
669 mac_icr_read(E1000State
*s
, int index
)
671 uint32_t ret
= s
->mac_reg
[ICR
];
673 DBGOUT(INTERRUPT
, "ICR read: %x\n", ret
);
674 set_interrupt_cause(s
, 0, 0);
679 mac_read_clr4(E1000State
*s
, int index
)
681 uint32_t ret
= s
->mac_reg
[index
];
683 s
->mac_reg
[index
] = 0;
688 mac_read_clr8(E1000State
*s
, int index
)
690 uint32_t ret
= s
->mac_reg
[index
];
692 s
->mac_reg
[index
] = 0;
693 s
->mac_reg
[index
-1] = 0;
698 mac_writereg(E1000State
*s
, int index
, uint32_t val
)
700 s
->mac_reg
[index
] = val
;
704 set_rdt(E1000State
*s
, int index
, uint32_t val
)
707 s
->mac_reg
[index
] = val
& 0xffff;
711 set_16bit(E1000State
*s
, int index
, uint32_t val
)
713 s
->mac_reg
[index
] = val
& 0xffff;
717 set_dlen(E1000State
*s
, int index
, uint32_t val
)
719 s
->mac_reg
[index
] = val
& 0xfff80;
723 set_tctl(E1000State
*s
, int index
, uint32_t val
)
725 s
->mac_reg
[index
] = val
;
726 s
->mac_reg
[TDT
] &= 0xffff;
731 set_icr(E1000State
*s
, int index
, uint32_t val
)
733 DBGOUT(INTERRUPT
, "set_icr %x\n", val
);
734 set_interrupt_cause(s
, 0, s
->mac_reg
[ICR
] & ~val
);
738 set_imc(E1000State
*s
, int index
, uint32_t val
)
740 s
->mac_reg
[IMS
] &= ~val
;
745 set_ims(E1000State
*s
, int index
, uint32_t val
)
747 s
->mac_reg
[IMS
] |= val
;
751 #define getreg(x) [x] = mac_readreg
752 static uint32_t (*macreg_readops
[])(E1000State
*, int) = {
753 getreg(PBA
), getreg(RCTL
), getreg(TDH
), getreg(TXDCTL
),
754 getreg(WUFC
), getreg(TDT
), getreg(CTRL
), getreg(LEDCTL
),
755 getreg(MANC
), getreg(MDIC
), getreg(SWSM
), getreg(STATUS
),
756 getreg(TORL
), getreg(TOTL
), getreg(IMS
), getreg(TCTL
),
757 getreg(RDH
), getreg(RDT
), getreg(VET
),
759 [TOTH
] = mac_read_clr8
, [TORH
] = mac_read_clr8
, [GPRC
] = mac_read_clr4
,
760 [GPTC
] = mac_read_clr4
, [TPR
] = mac_read_clr4
, [TPT
] = mac_read_clr4
,
761 [ICR
] = mac_icr_read
, [EECD
] = get_eecd
, [EERD
] = flash_eerd_read
,
762 [CRCERRS
... MPC
] = &mac_readreg
,
763 [RA
... RA
+31] = &mac_readreg
,
764 [MTA
... MTA
+127] = &mac_readreg
,
765 [VFTA
... VFTA
+127] = &mac_readreg
,
767 enum { NREADOPS
= sizeof(macreg_readops
) / sizeof(*macreg_readops
) };
769 #define putreg(x) [x] = mac_writereg
770 static void (*macreg_writeops
[])(E1000State
*, int, uint32_t) = {
771 putreg(PBA
), putreg(EERD
), putreg(SWSM
), putreg(WUFC
),
772 putreg(TDBAL
), putreg(TDBAH
), putreg(TXDCTL
), putreg(RDBAH
),
773 putreg(RDBAL
), putreg(LEDCTL
), putreg(CTRL
), putreg(VET
),
774 [TDLEN
] = set_dlen
, [RDLEN
] = set_dlen
, [TCTL
] = set_tctl
,
775 [TDT
] = set_tctl
, [MDIC
] = set_mdic
, [ICS
] = set_ics
,
776 [TDH
] = set_16bit
, [RDH
] = set_16bit
, [RDT
] = set_rdt
,
777 [IMC
] = set_imc
, [IMS
] = set_ims
, [ICR
] = set_icr
,
778 [EECD
] = set_eecd
, [RCTL
] = set_rx_control
,
779 [RA
... RA
+31] = &mac_writereg
,
780 [MTA
... MTA
+127] = &mac_writereg
,
781 [VFTA
... VFTA
+127] = &mac_writereg
,
783 enum { NWRITEOPS
= sizeof(macreg_writeops
) / sizeof(*macreg_writeops
) };
786 e1000_mmio_writel(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
788 E1000State
*s
= opaque
;
789 unsigned int index
= ((addr
- s
->mmio_base
) & 0x1ffff) >> 2;
791 #ifdef TARGET_WORDS_BIGENDIAN
794 if (index
< NWRITEOPS
&& macreg_writeops
[index
])
795 macreg_writeops
[index
](s
, index
, val
);
796 else if (index
< NREADOPS
&& macreg_readops
[index
])
797 DBGOUT(MMIO
, "e1000_mmio_writel RO %x: 0x%04x\n", index
<<2, val
);
799 DBGOUT(UNKNOWN
, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
804 e1000_mmio_writew(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
806 // emulate hw without byte enables: no RMW
807 e1000_mmio_writel(opaque
, addr
& ~3,
808 (val
& 0xffff) << (8*(addr
& 3)));
812 e1000_mmio_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
814 // emulate hw without byte enables: no RMW
815 e1000_mmio_writel(opaque
, addr
& ~3,
816 (val
& 0xff) << (8*(addr
& 3)));
820 e1000_mmio_readl(void *opaque
, target_phys_addr_t addr
)
822 E1000State
*s
= opaque
;
823 unsigned int index
= ((addr
- s
->mmio_base
) & 0x1ffff) >> 2;
825 if (index
< NREADOPS
&& macreg_readops
[index
])
827 uint32_t val
= macreg_readops
[index
](s
, index
);
828 #ifdef TARGET_WORDS_BIGENDIAN
833 DBGOUT(UNKNOWN
, "MMIO unknown read addr=0x%08x\n", index
<<2);
838 e1000_mmio_readb(void *opaque
, target_phys_addr_t addr
)
840 return ((e1000_mmio_readl(opaque
, addr
& ~3)) >>
841 (8 * (addr
& 3))) & 0xff;
845 e1000_mmio_readw(void *opaque
, target_phys_addr_t addr
)
847 return ((e1000_mmio_readl(opaque
, addr
& ~3)) >>
848 (8 * (addr
& 3))) & 0xffff;
851 static const int mac_regtosave
[] = {
852 CTRL
, EECD
, EERD
, GPRC
, GPTC
, ICR
, ICS
, IMC
, IMS
,
853 LEDCTL
, MANC
, MDIC
, MPC
, PBA
, RCTL
, RDBAH
, RDBAL
, RDH
,
854 RDLEN
, RDT
, STATUS
, SWSM
, TCTL
, TDBAH
, TDBAL
, TDH
, TDLEN
,
855 TDT
, TORH
, TORL
, TOTH
, TOTL
, TPR
, TPT
, TXDCTL
, WUFC
,
858 enum { MAC_NSAVE
= sizeof mac_regtosave
/sizeof *mac_regtosave
};
860 static const struct {
863 } mac_regarraystosave
[] = { {32, RA
}, {128, MTA
}, {128, VFTA
} };
864 enum { MAC_NARRAYS
= sizeof mac_regarraystosave
/sizeof *mac_regarraystosave
};
867 nic_save(QEMUFile
*f
, void *opaque
)
869 E1000State
*s
= (E1000State
*)opaque
;
872 pci_device_save(&s
->dev
, f
);
873 qemu_put_be32s(f
, &s
->mmio_base
);
874 qemu_put_be32s(f
, &s
->rxbuf_size
);
875 qemu_put_be32s(f
, &s
->rxbuf_min_shift
);
876 qemu_put_be32s(f
, &s
->eecd_state
.val_in
);
877 qemu_put_be16s(f
, &s
->eecd_state
.bitnum_in
);
878 qemu_put_be16s(f
, &s
->eecd_state
.bitnum_out
);
879 qemu_put_be16s(f
, &s
->eecd_state
.reading
);
880 qemu_put_be32s(f
, &s
->eecd_state
.old_eecd
);
881 qemu_put_8s(f
, &s
->tx
.ipcss
);
882 qemu_put_8s(f
, &s
->tx
.ipcso
);
883 qemu_put_be16s(f
, &s
->tx
.ipcse
);
884 qemu_put_8s(f
, &s
->tx
.tucss
);
885 qemu_put_8s(f
, &s
->tx
.tucso
);
886 qemu_put_be16s(f
, &s
->tx
.tucse
);
887 qemu_put_be32s(f
, &s
->tx
.paylen
);
888 qemu_put_8s(f
, &s
->tx
.hdr_len
);
889 qemu_put_be16s(f
, &s
->tx
.mss
);
890 qemu_put_be16s(f
, &s
->tx
.size
);
891 qemu_put_be16s(f
, &s
->tx
.tso_frames
);
892 qemu_put_8s(f
, &s
->tx
.sum_needed
);
893 qemu_put_s8s(f
, &s
->tx
.ip
);
894 qemu_put_s8s(f
, &s
->tx
.tcp
);
895 qemu_put_buffer(f
, s
->tx
.header
, sizeof s
->tx
.header
);
896 qemu_put_buffer(f
, s
->tx
.data
, sizeof s
->tx
.data
);
897 for (i
= 0; i
< 64; i
++)
898 qemu_put_be16s(f
, s
->eeprom_data
+ i
);
899 for (i
= 0; i
< 0x20; i
++)
900 qemu_put_be16s(f
, s
->phy_reg
+ i
);
901 for (i
= 0; i
< MAC_NSAVE
; i
++)
902 qemu_put_be32s(f
, s
->mac_reg
+ mac_regtosave
[i
]);
903 for (i
= 0; i
< MAC_NARRAYS
; i
++)
904 for (j
= 0; j
< mac_regarraystosave
[i
].size
; j
++)
906 s
->mac_reg
+ mac_regarraystosave
[i
].array0
+ j
);
910 nic_load(QEMUFile
*f
, void *opaque
, int version_id
)
912 E1000State
*s
= (E1000State
*)opaque
;
915 if ((ret
= pci_device_load(&s
->dev
, f
)) < 0)
918 qemu_get_sbe32s(f
, &i
); /* once some unused instance id */
919 qemu_get_be32s(f
, &s
->mmio_base
);
920 qemu_get_be32s(f
, &s
->rxbuf_size
);
921 qemu_get_be32s(f
, &s
->rxbuf_min_shift
);
922 qemu_get_be32s(f
, &s
->eecd_state
.val_in
);
923 qemu_get_be16s(f
, &s
->eecd_state
.bitnum_in
);
924 qemu_get_be16s(f
, &s
->eecd_state
.bitnum_out
);
925 qemu_get_be16s(f
, &s
->eecd_state
.reading
);
926 qemu_get_be32s(f
, &s
->eecd_state
.old_eecd
);
927 qemu_get_8s(f
, &s
->tx
.ipcss
);
928 qemu_get_8s(f
, &s
->tx
.ipcso
);
929 qemu_get_be16s(f
, &s
->tx
.ipcse
);
930 qemu_get_8s(f
, &s
->tx
.tucss
);
931 qemu_get_8s(f
, &s
->tx
.tucso
);
932 qemu_get_be16s(f
, &s
->tx
.tucse
);
933 qemu_get_be32s(f
, &s
->tx
.paylen
);
934 qemu_get_8s(f
, &s
->tx
.hdr_len
);
935 qemu_get_be16s(f
, &s
->tx
.mss
);
936 qemu_get_be16s(f
, &s
->tx
.size
);
937 qemu_get_be16s(f
, &s
->tx
.tso_frames
);
938 qemu_get_8s(f
, &s
->tx
.sum_needed
);
939 qemu_get_s8s(f
, &s
->tx
.ip
);
940 qemu_get_s8s(f
, &s
->tx
.tcp
);
941 qemu_get_buffer(f
, s
->tx
.header
, sizeof s
->tx
.header
);
942 qemu_get_buffer(f
, s
->tx
.data
, sizeof s
->tx
.data
);
943 for (i
= 0; i
< 64; i
++)
944 qemu_get_be16s(f
, s
->eeprom_data
+ i
);
945 for (i
= 0; i
< 0x20; i
++)
946 qemu_get_be16s(f
, s
->phy_reg
+ i
);
947 for (i
= 0; i
< MAC_NSAVE
; i
++)
948 qemu_get_be32s(f
, s
->mac_reg
+ mac_regtosave
[i
]);
949 for (i
= 0; i
< MAC_NARRAYS
; i
++)
950 for (j
= 0; j
< mac_regarraystosave
[i
].size
; j
++)
952 s
->mac_reg
+ mac_regarraystosave
[i
].array0
+ j
);
956 static const uint16_t e1000_eeprom_template
[64] = {
957 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
958 0x3000, 0x1000, 0x6403, E1000_DEVID
, 0x8086, E1000_DEVID
, 0x8086, 0x3040,
959 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
960 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
961 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
962 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
963 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
964 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
967 static const uint16_t phy_reg_init
[] = {
968 [PHY_CTRL
] = 0x1140, [PHY_STATUS
] = 0x796d, // link initially up
969 [PHY_ID1
] = 0x141, [PHY_ID2
] = PHY_ID2_INIT
,
970 [PHY_1000T_CTRL
] = 0x0e00, [M88E1000_PHY_SPEC_CTRL
] = 0x360,
971 [M88E1000_EXT_PHY_SPEC_CTRL
] = 0x0d60, [PHY_AUTONEG_ADV
] = 0xde1,
972 [PHY_LP_ABILITY
] = 0x1e0, [PHY_1000T_STATUS
] = 0x3c00,
973 [M88E1000_PHY_SPEC_STATUS
] = 0xac00,
976 static const uint32_t mac_reg_init
[] = {
979 [CTRL
] = E1000_CTRL_SWDPIN2
| E1000_CTRL_SWDPIN0
|
980 E1000_CTRL_SPD_1000
| E1000_CTRL_SLU
,
981 [STATUS
] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE
|
982 E1000_STATUS_ASDV
| E1000_STATUS_MTXCKOK
|
983 E1000_STATUS_SPEED_1000
| E1000_STATUS_FD
|
985 [MANC
] = E1000_MANC_EN_MNG2HOST
| E1000_MANC_RCV_TCO_EN
|
986 E1000_MANC_ARP_EN
| E1000_MANC_0298_EN
|
992 static CPUWriteMemoryFunc
*e1000_mmio_write
[] = {
993 e1000_mmio_writeb
, e1000_mmio_writew
, e1000_mmio_writel
996 static CPUReadMemoryFunc
*e1000_mmio_read
[] = {
997 e1000_mmio_readb
, e1000_mmio_readw
, e1000_mmio_readl
1001 e1000_mmio_map(PCIDevice
*pci_dev
, int region_num
,
1002 uint32_t addr
, uint32_t size
, int type
)
1004 E1000State
*d
= (E1000State
*)pci_dev
;
1006 DBGOUT(MMIO
, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr
, size
);
1008 d
->mmio_base
= addr
;
1009 cpu_register_physical_memory(addr
, PNPMMIO_SIZE
, d
->mmio_index
);
1013 pci_e1000_init(PCIBus
*bus
, NICInfo
*nd
, int devfn
)
1017 uint16_t checksum
= 0;
1018 static const char info_str
[] = "e1000";
1021 d
= (E1000State
*)pci_register_device(bus
, "e1000",
1022 sizeof(E1000State
), devfn
, NULL
, NULL
);
1024 pci_conf
= d
->dev
.config
;
1025 memset(pci_conf
, 0, 256);
1027 *(uint16_t *)(pci_conf
+0x00) = cpu_to_le16(0x8086);
1028 *(uint16_t *)(pci_conf
+0x02) = cpu_to_le16(E1000_DEVID
);
1029 *(uint16_t *)(pci_conf
+0x04) = cpu_to_le16(0x0407);
1030 *(uint16_t *)(pci_conf
+0x06) = cpu_to_le16(0x0010);
1031 pci_conf
[0x08] = 0x03;
1032 pci_conf
[0x0a] = 0x00; // ethernet network controller
1033 pci_conf
[0x0b] = 0x02;
1034 pci_conf
[0x0c] = 0x10;
1036 pci_conf
[0x3d] = 1; // interrupt pin 0
1038 d
->mmio_index
= cpu_register_io_memory(0, e1000_mmio_read
,
1039 e1000_mmio_write
, d
);
1041 pci_register_io_region((PCIDevice
*)d
, 0, PNPMMIO_SIZE
,
1042 PCI_ADDRESS_SPACE_MEM
, e1000_mmio_map
);
1044 pci_register_io_region((PCIDevice
*)d
, 1, IOPORT_SIZE
,
1045 PCI_ADDRESS_SPACE_IO
, ioport_map
);
1048 memmove(d
->eeprom_data
, e1000_eeprom_template
,
1049 sizeof e1000_eeprom_template
);
1050 for (i
= 0; i
< 3; i
++)
1051 d
->eeprom_data
[i
] = (nd
->macaddr
[2*i
+1]<<8) | nd
->macaddr
[2*i
];
1052 for (i
= 0; i
< EEPROM_CHECKSUM_REG
; i
++)
1053 checksum
+= d
->eeprom_data
[i
];
1054 checksum
= (uint16_t) EEPROM_SUM
- checksum
;
1055 d
->eeprom_data
[EEPROM_CHECKSUM_REG
] = checksum
;
1057 memset(d
->phy_reg
, 0, sizeof d
->phy_reg
);
1058 memmove(d
->phy_reg
, phy_reg_init
, sizeof phy_reg_init
);
1059 memset(d
->mac_reg
, 0, sizeof d
->mac_reg
);
1060 memmove(d
->mac_reg
, mac_reg_init
, sizeof mac_reg_init
);
1061 d
->rxbuf_min_shift
= 1;
1062 memset(&d
->tx
, 0, sizeof d
->tx
);
1064 d
->vc
= qemu_new_vlan_client(nd
->vlan
, e1000_receive
,
1065 e1000_can_receive
, d
);
1067 snprintf(d
->vc
->info_str
, sizeof(d
->vc
->info_str
),
1068 "%s macaddr=%02x:%02x:%02x:%02x:%02x:%02x", info_str
,
1069 d
->nd
->macaddr
[0], d
->nd
->macaddr
[1], d
->nd
->macaddr
[2],
1070 d
->nd
->macaddr
[3], d
->nd
->macaddr
[4], d
->nd
->macaddr
[5]);
1072 register_savevm(info_str
, -1, 2, nic_save
, nic_load
, d
);