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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 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
{
81 uint32_t mac_reg
[0x8000];
82 uint16_t phy_reg
[0x20];
83 uint16_t eeprom_data
[64];
86 uint32_t rxbuf_min_shift
;
89 unsigned char header
[256];
90 unsigned char vlan_header
[4];
91 unsigned char vlan
[4];
92 unsigned char data
[0x10000];
94 unsigned char sum_needed
;
95 unsigned char vlan_needed
;
109 char cptse
; // current packet tse bit
113 uint32_t val_in
; // shifted in from guest driver
121 #define defreg(x) x = (E1000_##x>>2)
123 defreg(CTRL
), defreg(EECD
), defreg(EERD
), defreg(GPRC
),
124 defreg(GPTC
), defreg(ICR
), defreg(ICS
), defreg(IMC
),
125 defreg(IMS
), defreg(LEDCTL
), defreg(MANC
), defreg(MDIC
),
126 defreg(MPC
), defreg(PBA
), defreg(RCTL
), defreg(RDBAH
),
127 defreg(RDBAL
), defreg(RDH
), defreg(RDLEN
), defreg(RDT
),
128 defreg(STATUS
), defreg(SWSM
), defreg(TCTL
), defreg(TDBAH
),
129 defreg(TDBAL
), defreg(TDH
), defreg(TDLEN
), defreg(TDT
),
130 defreg(TORH
), defreg(TORL
), defreg(TOTH
), defreg(TOTL
),
131 defreg(TPR
), defreg(TPT
), defreg(TXDCTL
), defreg(WUFC
),
132 defreg(RA
), defreg(MTA
), defreg(CRCERRS
),defreg(VFTA
),
136 enum { PHY_R
= 1, PHY_W
= 2, PHY_RW
= PHY_R
| PHY_W
};
137 static const char phy_regcap
[0x20] = {
138 [PHY_STATUS
] = PHY_R
, [M88E1000_EXT_PHY_SPEC_CTRL
] = PHY_RW
,
139 [PHY_ID1
] = PHY_R
, [M88E1000_PHY_SPEC_CTRL
] = PHY_RW
,
140 [PHY_CTRL
] = PHY_RW
, [PHY_1000T_CTRL
] = PHY_RW
,
141 [PHY_LP_ABILITY
] = PHY_R
, [PHY_1000T_STATUS
] = PHY_R
,
142 [PHY_AUTONEG_ADV
] = PHY_RW
, [M88E1000_RX_ERR_CNTR
] = PHY_R
,
143 [PHY_ID2
] = PHY_R
, [M88E1000_PHY_SPEC_STATUS
] = PHY_R
147 ioport_map(PCIDevice
*pci_dev
, int region_num
, uint32_t addr
,
148 uint32_t size
, int type
)
150 DBGOUT(IO
, "e1000_ioport_map addr=0x%04x size=0x%08x\n", addr
, size
);
154 set_interrupt_cause(E1000State
*s
, int index
, uint32_t val
)
157 val
|= E1000_ICR_INT_ASSERTED
;
158 s
->mac_reg
[ICR
] = val
;
159 qemu_set_irq(s
->dev
.irq
[0], (s
->mac_reg
[IMS
] & s
->mac_reg
[ICR
]) != 0);
163 set_ics(E1000State
*s
, int index
, uint32_t val
)
165 DBGOUT(INTERRUPT
, "set_ics %x, ICR %x, IMR %x\n", val
, s
->mac_reg
[ICR
],
167 set_interrupt_cause(s
, 0, val
| s
->mac_reg
[ICR
]);
171 rxbufsize(uint32_t v
)
173 v
&= E1000_RCTL_BSEX
| E1000_RCTL_SZ_16384
| E1000_RCTL_SZ_8192
|
174 E1000_RCTL_SZ_4096
| E1000_RCTL_SZ_2048
| E1000_RCTL_SZ_1024
|
175 E1000_RCTL_SZ_512
| E1000_RCTL_SZ_256
;
177 case E1000_RCTL_BSEX
| E1000_RCTL_SZ_16384
:
179 case E1000_RCTL_BSEX
| E1000_RCTL_SZ_8192
:
181 case E1000_RCTL_BSEX
| E1000_RCTL_SZ_4096
:
183 case E1000_RCTL_SZ_1024
:
185 case E1000_RCTL_SZ_512
:
187 case E1000_RCTL_SZ_256
:
194 set_rx_control(E1000State
*s
, int index
, uint32_t val
)
196 s
->mac_reg
[RCTL
] = val
;
197 s
->rxbuf_size
= rxbufsize(val
);
198 s
->rxbuf_min_shift
= ((val
/ E1000_RCTL_RDMTS_QUAT
) & 3) + 1;
199 DBGOUT(RX
, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s
->mac_reg
[RDT
],
204 set_mdic(E1000State
*s
, int index
, uint32_t val
)
206 uint32_t data
= val
& E1000_MDIC_DATA_MASK
;
207 uint32_t addr
= ((val
& E1000_MDIC_REG_MASK
) >> E1000_MDIC_REG_SHIFT
);
209 if ((val
& E1000_MDIC_PHY_MASK
) >> E1000_MDIC_PHY_SHIFT
!= 1) // phy #
210 val
= s
->mac_reg
[MDIC
] | E1000_MDIC_ERROR
;
211 else if (val
& E1000_MDIC_OP_READ
) {
212 DBGOUT(MDIC
, "MDIC read reg 0x%x\n", addr
);
213 if (!(phy_regcap
[addr
] & PHY_R
)) {
214 DBGOUT(MDIC
, "MDIC read reg %x unhandled\n", addr
);
215 val
|= E1000_MDIC_ERROR
;
217 val
= (val
^ data
) | s
->phy_reg
[addr
];
218 } else if (val
& E1000_MDIC_OP_WRITE
) {
219 DBGOUT(MDIC
, "MDIC write reg 0x%x, value 0x%x\n", addr
, data
);
220 if (!(phy_regcap
[addr
] & PHY_W
)) {
221 DBGOUT(MDIC
, "MDIC write reg %x unhandled\n", addr
);
222 val
|= E1000_MDIC_ERROR
;
224 s
->phy_reg
[addr
] = data
;
226 s
->mac_reg
[MDIC
] = val
| E1000_MDIC_READY
;
227 set_ics(s
, 0, E1000_ICR_MDAC
);
231 get_eecd(E1000State
*s
, int index
)
233 uint32_t ret
= E1000_EECD_PRES
|E1000_EECD_GNT
| s
->eecd_state
.old_eecd
;
235 DBGOUT(EEPROM
, "reading eeprom bit %d (reading %d)\n",
236 s
->eecd_state
.bitnum_out
, s
->eecd_state
.reading
);
237 if (!s
->eecd_state
.reading
||
238 ((s
->eeprom_data
[(s
->eecd_state
.bitnum_out
>> 4) & 0x3f] >>
239 ((s
->eecd_state
.bitnum_out
& 0xf) ^ 0xf))) & 1)
240 ret
|= E1000_EECD_DO
;
245 set_eecd(E1000State
*s
, int index
, uint32_t val
)
247 uint32_t oldval
= s
->eecd_state
.old_eecd
;
249 s
->eecd_state
.old_eecd
= val
& (E1000_EECD_SK
| E1000_EECD_CS
|
250 E1000_EECD_DI
|E1000_EECD_FWE_MASK
|E1000_EECD_REQ
);
251 if (!(E1000_EECD_SK
& (val
^ oldval
))) // no clock edge
253 if (!(E1000_EECD_SK
& val
)) { // falling edge
254 s
->eecd_state
.bitnum_out
++;
257 if (!(val
& E1000_EECD_CS
)) { // rising, no CS (EEPROM reset)
258 memset(&s
->eecd_state
, 0, sizeof s
->eecd_state
);
261 s
->eecd_state
.val_in
<<= 1;
262 if (val
& E1000_EECD_DI
)
263 s
->eecd_state
.val_in
|= 1;
264 if (++s
->eecd_state
.bitnum_in
== 9 && !s
->eecd_state
.reading
) {
265 s
->eecd_state
.bitnum_out
= ((s
->eecd_state
.val_in
& 0x3f)<<4)-1;
266 s
->eecd_state
.reading
= (((s
->eecd_state
.val_in
>> 6) & 7) ==
267 EEPROM_READ_OPCODE_MICROWIRE
);
269 DBGOUT(EEPROM
, "eeprom bitnum in %d out %d, reading %d\n",
270 s
->eecd_state
.bitnum_in
, s
->eecd_state
.bitnum_out
,
271 s
->eecd_state
.reading
);
275 flash_eerd_read(E1000State
*s
, int x
)
277 unsigned int index
, r
= s
->mac_reg
[EERD
] & ~E1000_EEPROM_RW_REG_START
;
279 if ((index
= r
>> E1000_EEPROM_RW_ADDR_SHIFT
) > EEPROM_CHECKSUM_REG
)
281 return (s
->eeprom_data
[index
] << E1000_EEPROM_RW_REG_DATA
) |
282 E1000_EEPROM_RW_REG_DONE
| r
;
286 putsum(uint8_t *data
, uint32_t n
, uint32_t sloc
, uint32_t css
, uint32_t cse
)
293 sum
= net_checksum_add(n
-css
, data
+css
);
294 cpu_to_be16wu((uint16_t *)(data
+ sloc
),
295 net_checksum_finish(sum
));
300 vlan_enabled(E1000State
*s
)
302 return ((s
->mac_reg
[CTRL
] & E1000_CTRL_VME
) != 0);
306 vlan_rx_filter_enabled(E1000State
*s
)
308 return ((s
->mac_reg
[RCTL
] & E1000_RCTL_VFE
) != 0);
312 is_vlan_packet(E1000State
*s
, const uint8_t *buf
)
314 return (be16_to_cpup((uint16_t *)(buf
+ 12)) ==
315 le16_to_cpup((uint16_t *)(s
->mac_reg
+ VET
)));
319 is_vlan_txd(uint32_t txd_lower
)
321 return ((txd_lower
& E1000_TXD_CMD_VLE
) != 0);
325 xmit_seg(E1000State
*s
)
328 unsigned int frames
= s
->tx
.tso_frames
, css
, sofar
, n
;
329 struct e1000_tx
*tp
= &s
->tx
;
331 if (tp
->tse
&& tp
->cptse
) {
333 DBGOUT(TXSUM
, "frames %d size %d ipcss %d\n",
334 frames
, tp
->size
, css
);
335 if (tp
->ip
) { // IPv4
336 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+2),
338 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+4),
339 be16_to_cpup((uint16_t *)(tp
->data
+css
+4))+frames
);
341 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+4),
344 len
= tp
->size
- css
;
345 DBGOUT(TXSUM
, "tcp %d tucss %d len %d\n", tp
->tcp
, css
, len
);
347 sofar
= frames
* tp
->mss
;
348 cpu_to_be32wu((uint32_t *)(tp
->data
+css
+4), // seq
349 be32_to_cpupu((uint32_t *)(tp
->data
+css
+4))+sofar
);
350 if (tp
->paylen
- sofar
> tp
->mss
)
351 tp
->data
[css
+ 13] &= ~9; // PSH, FIN
353 cpu_to_be16wu((uint16_t *)(tp
->data
+css
+4), len
);
354 if (tp
->sum_needed
& E1000_TXD_POPTS_TXSM
) {
355 // add pseudo-header length before checksum calculation
356 sp
= (uint16_t *)(tp
->data
+ tp
->tucso
);
357 cpu_to_be16wu(sp
, be16_to_cpup(sp
) + len
);
362 if (tp
->sum_needed
& E1000_TXD_POPTS_TXSM
)
363 putsum(tp
->data
, tp
->size
, tp
->tucso
, tp
->tucss
, tp
->tucse
);
364 if (tp
->sum_needed
& E1000_TXD_POPTS_IXSM
)
365 putsum(tp
->data
, tp
->size
, tp
->ipcso
, tp
->ipcss
, tp
->ipcse
);
366 if (tp
->vlan_needed
) {
367 memmove(tp
->vlan
, tp
->data
, 12);
368 memcpy(tp
->data
+ 8, tp
->vlan_header
, 4);
369 qemu_send_packet(s
->vc
, tp
->vlan
, tp
->size
+ 4);
371 qemu_send_packet(s
->vc
, tp
->data
, tp
->size
);
374 n
= s
->mac_reg
[TOTL
];
375 if ((s
->mac_reg
[TOTL
] += s
->tx
.size
) < n
)
380 process_tx_desc(E1000State
*s
, struct e1000_tx_desc
*dp
)
382 uint32_t txd_lower
= le32_to_cpu(dp
->lower
.data
);
383 uint32_t dtype
= txd_lower
& (E1000_TXD_CMD_DEXT
| E1000_TXD_DTYP_D
);
384 unsigned int split_size
= txd_lower
& 0xffff, bytes
, sz
, op
;
385 unsigned int msh
= 0xfffff, hdr
= 0;
387 struct e1000_context_desc
*xp
= (struct e1000_context_desc
*)dp
;
388 struct e1000_tx
*tp
= &s
->tx
;
390 if (dtype
== E1000_TXD_CMD_DEXT
) { // context descriptor
391 op
= le32_to_cpu(xp
->cmd_and_length
);
392 tp
->ipcss
= xp
->lower_setup
.ip_fields
.ipcss
;
393 tp
->ipcso
= xp
->lower_setup
.ip_fields
.ipcso
;
394 tp
->ipcse
= le16_to_cpu(xp
->lower_setup
.ip_fields
.ipcse
);
395 tp
->tucss
= xp
->upper_setup
.tcp_fields
.tucss
;
396 tp
->tucso
= xp
->upper_setup
.tcp_fields
.tucso
;
397 tp
->tucse
= le16_to_cpu(xp
->upper_setup
.tcp_fields
.tucse
);
398 tp
->paylen
= op
& 0xfffff;
399 tp
->hdr_len
= xp
->tcp_seg_setup
.fields
.hdr_len
;
400 tp
->mss
= le16_to_cpu(xp
->tcp_seg_setup
.fields
.mss
);
401 tp
->ip
= (op
& E1000_TXD_CMD_IP
) ? 1 : 0;
402 tp
->tcp
= (op
& E1000_TXD_CMD_TCP
) ? 1 : 0;
403 tp
->tse
= (op
& E1000_TXD_CMD_TSE
) ? 1 : 0;
405 if (tp
->tucso
== 0) { // this is probably wrong
406 DBGOUT(TXSUM
, "TCP/UDP: cso 0!\n");
407 tp
->tucso
= tp
->tucss
+ (tp
->tcp
? 16 : 6);
410 } else if (dtype
== (E1000_TXD_CMD_DEXT
| E1000_TXD_DTYP_D
)) {
412 tp
->sum_needed
= le32_to_cpu(dp
->upper
.data
) >> 8;
413 tp
->cptse
= ( txd_lower
& E1000_TXD_CMD_TSE
) ? 1 : 0;
418 if (vlan_enabled(s
) && is_vlan_txd(txd_lower
) &&
419 (tp
->cptse
|| txd_lower
& E1000_TXD_CMD_EOP
)) {
421 cpu_to_be16wu((uint16_t *)(tp
->vlan_header
),
422 le16_to_cpup((uint16_t *)(s
->mac_reg
+ VET
)));
423 cpu_to_be16wu((uint16_t *)(tp
->vlan_header
+ 2),
424 le16_to_cpu(dp
->upper
.fields
.special
));
427 addr
= le64_to_cpu(dp
->buffer_addr
);
428 if (tp
->tse
&& tp
->cptse
) {
433 if (tp
->size
+ bytes
> msh
)
434 bytes
= msh
- tp
->size
;
435 cpu_physical_memory_read(addr
, tp
->data
+ tp
->size
, bytes
);
436 if ((sz
= tp
->size
+ bytes
) >= hdr
&& tp
->size
< hdr
)
437 memmove(tp
->header
, tp
->data
, hdr
);
442 memmove(tp
->data
, tp
->header
, hdr
);
445 } while (split_size
-= bytes
);
446 } else if (!tp
->tse
&& tp
->cptse
) {
447 // context descriptor TSE is not set, while data descriptor TSE is set
448 DBGOUT(TXERR
, "TCP segmentaion Error\n");
450 cpu_physical_memory_read(addr
, tp
->data
+ tp
->size
, split_size
);
451 tp
->size
+= split_size
;
454 if (!(txd_lower
& E1000_TXD_CMD_EOP
))
456 if (!(tp
->tse
&& tp
->cptse
&& tp
->size
< hdr
))
466 txdesc_writeback(target_phys_addr_t base
, struct e1000_tx_desc
*dp
)
468 uint32_t txd_upper
, txd_lower
= le32_to_cpu(dp
->lower
.data
);
470 if (!(txd_lower
& (E1000_TXD_CMD_RS
|E1000_TXD_CMD_RPS
)))
472 txd_upper
= (le32_to_cpu(dp
->upper
.data
) | E1000_TXD_STAT_DD
) &
473 ~(E1000_TXD_STAT_EC
| E1000_TXD_STAT_LC
| E1000_TXD_STAT_TU
);
474 dp
->upper
.data
= cpu_to_le32(txd_upper
);
475 cpu_physical_memory_write(base
+ ((char *)&dp
->upper
- (char *)dp
),
476 (void *)&dp
->upper
, sizeof(dp
->upper
));
477 return E1000_ICR_TXDW
;
481 start_xmit(E1000State
*s
)
483 target_phys_addr_t base
;
484 struct e1000_tx_desc desc
;
485 uint32_t tdh_start
= s
->mac_reg
[TDH
], cause
= E1000_ICS_TXQE
;
487 if (!(s
->mac_reg
[TCTL
] & E1000_TCTL_EN
)) {
488 DBGOUT(TX
, "tx disabled\n");
492 while (s
->mac_reg
[TDH
] != s
->mac_reg
[TDT
]) {
493 base
= ((uint64_t)s
->mac_reg
[TDBAH
] << 32) + s
->mac_reg
[TDBAL
] +
494 sizeof(struct e1000_tx_desc
) * s
->mac_reg
[TDH
];
495 cpu_physical_memory_read(base
, (void *)&desc
, sizeof(desc
));
497 DBGOUT(TX
, "index %d: %p : %x %x\n", s
->mac_reg
[TDH
],
498 (void *)(intptr_t)desc
.buffer_addr
, desc
.lower
.data
,
501 process_tx_desc(s
, &desc
);
502 cause
|= txdesc_writeback(base
, &desc
);
504 if (++s
->mac_reg
[TDH
] * sizeof(desc
) >= s
->mac_reg
[TDLEN
])
507 * the following could happen only if guest sw assigns
508 * bogus values to TDT/TDLEN.
509 * there's nothing too intelligent we could do about this.
511 if (s
->mac_reg
[TDH
] == tdh_start
) {
512 DBGOUT(TXERR
, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
513 tdh_start
, s
->mac_reg
[TDT
], s
->mac_reg
[TDLEN
]);
517 set_ics(s
, 0, cause
);
521 receive_filter(E1000State
*s
, const uint8_t *buf
, int size
)
523 static uint8_t bcast
[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
524 static int mta_shift
[] = {4, 3, 2, 0};
525 uint32_t f
, rctl
= s
->mac_reg
[RCTL
], ra
[2], *rp
;
527 if (is_vlan_packet(s
, buf
) && vlan_rx_filter_enabled(s
)) {
528 uint16_t vid
= be16_to_cpup((uint16_t *)(buf
+ 14));
529 uint32_t vfta
= le32_to_cpup((uint32_t *)(s
->mac_reg
+ VFTA
) +
530 ((vid
>> 5) & 0x7f));
531 if ((vfta
& (1 << (vid
& 0x1f))) == 0)
535 if (rctl
& E1000_RCTL_UPE
) // promiscuous
538 if ((buf
[0] & 1) && (rctl
& E1000_RCTL_MPE
)) // promiscuous mcast
541 if ((rctl
& E1000_RCTL_BAM
) && !memcmp(buf
, bcast
, sizeof bcast
))
544 for (rp
= s
->mac_reg
+ RA
; rp
< s
->mac_reg
+ RA
+ 32; rp
+= 2) {
545 if (!(rp
[1] & E1000_RAH_AV
))
547 ra
[0] = cpu_to_le32(rp
[0]);
548 ra
[1] = cpu_to_le32(rp
[1]);
549 if (!memcmp(buf
, (uint8_t *)ra
, 6)) {
551 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
552 (int)(rp
- s
->mac_reg
- RA
)/2,
553 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5]);
557 DBGOUT(RXFILTER
, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
558 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5]);
560 f
= mta_shift
[(rctl
>> E1000_RCTL_MO_SHIFT
) & 3];
561 f
= (((buf
[5] << 8) | buf
[4]) >> f
) & 0xfff;
562 if (s
->mac_reg
[MTA
+ (f
>> 5)] & (1 << (f
& 0x1f)))
565 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
566 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5],
567 (rctl
>> E1000_RCTL_MO_SHIFT
) & 3, f
>> 5,
568 s
->mac_reg
[MTA
+ (f
>> 5)]);
574 e1000_set_link_status(VLANClientState
*vc
)
576 E1000State
*s
= vc
->opaque
;
577 uint32_t old_status
= s
->mac_reg
[STATUS
];
580 s
->mac_reg
[STATUS
] &= ~E1000_STATUS_LU
;
582 s
->mac_reg
[STATUS
] |= E1000_STATUS_LU
;
584 if (s
->mac_reg
[STATUS
] != old_status
)
585 set_ics(s
, 0, E1000_ICR_LSC
);
589 e1000_can_receive(void *opaque
)
591 E1000State
*s
= opaque
;
593 return (s
->mac_reg
[RCTL
] & E1000_RCTL_EN
);
597 e1000_receive(void *opaque
, const uint8_t *buf
, int size
)
599 E1000State
*s
= opaque
;
600 struct e1000_rx_desc desc
;
601 target_phys_addr_t base
;
604 uint16_t vlan_special
= 0;
605 uint8_t vlan_status
= 0, vlan_offset
= 0;
607 if (!(s
->mac_reg
[RCTL
] & E1000_RCTL_EN
))
610 if (size
> s
->rxbuf_size
) {
611 DBGOUT(RX
, "packet too large for buffers (%d > %d)\n", size
,
616 if (!receive_filter(s
, buf
, size
))
619 if (vlan_enabled(s
) && is_vlan_packet(s
, buf
)) {
620 vlan_special
= cpu_to_le16(be16_to_cpup((uint16_t *)(buf
+ 14)));
621 memmove((void *)(buf
+ 4), buf
, 12);
622 vlan_status
= E1000_RXD_STAT_VP
;
627 rdh_start
= s
->mac_reg
[RDH
];
628 size
+= 4; // for the header
630 if (s
->mac_reg
[RDH
] == s
->mac_reg
[RDT
] && s
->check_rxov
) {
631 set_ics(s
, 0, E1000_ICS_RXO
);
634 base
= ((uint64_t)s
->mac_reg
[RDBAH
] << 32) + s
->mac_reg
[RDBAL
] +
635 sizeof(desc
) * s
->mac_reg
[RDH
];
636 cpu_physical_memory_read(base
, (void *)&desc
, sizeof(desc
));
637 desc
.special
= vlan_special
;
638 desc
.status
|= (vlan_status
| E1000_RXD_STAT_DD
);
639 if (desc
.buffer_addr
) {
640 cpu_physical_memory_write(le64_to_cpu(desc
.buffer_addr
),
641 (void *)(buf
+ vlan_offset
), size
);
642 desc
.length
= cpu_to_le16(size
);
643 desc
.status
|= E1000_RXD_STAT_EOP
|E1000_RXD_STAT_IXSM
;
644 } else // as per intel docs; skip descriptors with null buf addr
645 DBGOUT(RX
, "Null RX descriptor!!\n");
646 cpu_physical_memory_write(base
, (void *)&desc
, sizeof(desc
));
648 if (++s
->mac_reg
[RDH
] * sizeof(desc
) >= s
->mac_reg
[RDLEN
])
651 /* see comment in start_xmit; same here */
652 if (s
->mac_reg
[RDH
] == rdh_start
) {
653 DBGOUT(RXERR
, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
654 rdh_start
, s
->mac_reg
[RDT
], s
->mac_reg
[RDLEN
]);
655 set_ics(s
, 0, E1000_ICS_RXO
);
658 } while (desc
.buffer_addr
== 0);
662 n
= s
->mac_reg
[TORL
];
663 if ((s
->mac_reg
[TORL
] += size
) < n
)
667 if ((rdt
= s
->mac_reg
[RDT
]) < s
->mac_reg
[RDH
])
668 rdt
+= s
->mac_reg
[RDLEN
] / sizeof(desc
);
669 if (((rdt
- s
->mac_reg
[RDH
]) * sizeof(desc
)) << s
->rxbuf_min_shift
>=
671 n
|= E1000_ICS_RXDMT0
;
677 mac_readreg(E1000State
*s
, int index
)
679 return s
->mac_reg
[index
];
683 mac_icr_read(E1000State
*s
, int index
)
685 uint32_t ret
= s
->mac_reg
[ICR
];
687 DBGOUT(INTERRUPT
, "ICR read: %x\n", ret
);
688 set_interrupt_cause(s
, 0, 0);
693 mac_read_clr4(E1000State
*s
, int index
)
695 uint32_t ret
= s
->mac_reg
[index
];
697 s
->mac_reg
[index
] = 0;
702 mac_read_clr8(E1000State
*s
, int index
)
704 uint32_t ret
= s
->mac_reg
[index
];
706 s
->mac_reg
[index
] = 0;
707 s
->mac_reg
[index
-1] = 0;
712 mac_writereg(E1000State
*s
, int index
, uint32_t val
)
714 s
->mac_reg
[index
] = val
;
718 set_rdt(E1000State
*s
, int index
, uint32_t val
)
721 s
->mac_reg
[index
] = val
& 0xffff;
725 set_16bit(E1000State
*s
, int index
, uint32_t val
)
727 s
->mac_reg
[index
] = val
& 0xffff;
731 set_dlen(E1000State
*s
, int index
, uint32_t val
)
733 s
->mac_reg
[index
] = val
& 0xfff80;
737 set_tctl(E1000State
*s
, int index
, uint32_t val
)
739 s
->mac_reg
[index
] = val
;
740 s
->mac_reg
[TDT
] &= 0xffff;
745 set_icr(E1000State
*s
, int index
, uint32_t val
)
747 DBGOUT(INTERRUPT
, "set_icr %x\n", val
);
748 set_interrupt_cause(s
, 0, s
->mac_reg
[ICR
] & ~val
);
752 set_imc(E1000State
*s
, int index
, uint32_t val
)
754 s
->mac_reg
[IMS
] &= ~val
;
759 set_ims(E1000State
*s
, int index
, uint32_t val
)
761 s
->mac_reg
[IMS
] |= val
;
765 #define getreg(x) [x] = mac_readreg
766 static uint32_t (*macreg_readops
[])(E1000State
*, int) = {
767 getreg(PBA
), getreg(RCTL
), getreg(TDH
), getreg(TXDCTL
),
768 getreg(WUFC
), getreg(TDT
), getreg(CTRL
), getreg(LEDCTL
),
769 getreg(MANC
), getreg(MDIC
), getreg(SWSM
), getreg(STATUS
),
770 getreg(TORL
), getreg(TOTL
), getreg(IMS
), getreg(TCTL
),
771 getreg(RDH
), getreg(RDT
), getreg(VET
),
773 [TOTH
] = mac_read_clr8
, [TORH
] = mac_read_clr8
, [GPRC
] = mac_read_clr4
,
774 [GPTC
] = mac_read_clr4
, [TPR
] = mac_read_clr4
, [TPT
] = mac_read_clr4
,
775 [ICR
] = mac_icr_read
, [EECD
] = get_eecd
, [EERD
] = flash_eerd_read
,
776 [CRCERRS
... MPC
] = &mac_readreg
,
777 [RA
... RA
+31] = &mac_readreg
,
778 [MTA
... MTA
+127] = &mac_readreg
,
779 [VFTA
... VFTA
+127] = &mac_readreg
,
781 enum { NREADOPS
= ARRAY_SIZE(macreg_readops
) };
783 #define putreg(x) [x] = mac_writereg
784 static void (*macreg_writeops
[])(E1000State
*, int, uint32_t) = {
785 putreg(PBA
), putreg(EERD
), putreg(SWSM
), putreg(WUFC
),
786 putreg(TDBAL
), putreg(TDBAH
), putreg(TXDCTL
), putreg(RDBAH
),
787 putreg(RDBAL
), putreg(LEDCTL
), putreg(CTRL
), putreg(VET
),
788 [TDLEN
] = set_dlen
, [RDLEN
] = set_dlen
, [TCTL
] = set_tctl
,
789 [TDT
] = set_tctl
, [MDIC
] = set_mdic
, [ICS
] = set_ics
,
790 [TDH
] = set_16bit
, [RDH
] = set_16bit
, [RDT
] = set_rdt
,
791 [IMC
] = set_imc
, [IMS
] = set_ims
, [ICR
] = set_icr
,
792 [EECD
] = set_eecd
, [RCTL
] = set_rx_control
,
793 [RA
... RA
+31] = &mac_writereg
,
794 [MTA
... MTA
+127] = &mac_writereg
,
795 [VFTA
... VFTA
+127] = &mac_writereg
,
797 enum { NWRITEOPS
= ARRAY_SIZE(macreg_writeops
) };
800 e1000_mmio_writel(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
802 E1000State
*s
= opaque
;
803 unsigned int index
= (addr
& 0x1ffff) >> 2;
805 #ifdef TARGET_WORDS_BIGENDIAN
808 if (index
< NWRITEOPS
&& macreg_writeops
[index
])
809 macreg_writeops
[index
](s
, index
, val
);
810 else if (index
< NREADOPS
&& macreg_readops
[index
])
811 DBGOUT(MMIO
, "e1000_mmio_writel RO %x: 0x%04x\n", index
<<2, val
);
813 DBGOUT(UNKNOWN
, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
818 e1000_mmio_writew(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
820 // emulate hw without byte enables: no RMW
821 e1000_mmio_writel(opaque
, addr
& ~3,
822 (val
& 0xffff) << (8*(addr
& 3)));
826 e1000_mmio_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
828 // emulate hw without byte enables: no RMW
829 e1000_mmio_writel(opaque
, addr
& ~3,
830 (val
& 0xff) << (8*(addr
& 3)));
834 e1000_mmio_readl(void *opaque
, target_phys_addr_t addr
)
836 E1000State
*s
= opaque
;
837 unsigned int index
= (addr
& 0x1ffff) >> 2;
839 if (index
< NREADOPS
&& macreg_readops
[index
])
841 uint32_t val
= macreg_readops
[index
](s
, index
);
842 #ifdef TARGET_WORDS_BIGENDIAN
847 DBGOUT(UNKNOWN
, "MMIO unknown read addr=0x%08x\n", index
<<2);
852 e1000_mmio_readb(void *opaque
, target_phys_addr_t addr
)
854 return ((e1000_mmio_readl(opaque
, addr
& ~3)) >>
855 (8 * (addr
& 3))) & 0xff;
859 e1000_mmio_readw(void *opaque
, target_phys_addr_t addr
)
861 return ((e1000_mmio_readl(opaque
, addr
& ~3)) >>
862 (8 * (addr
& 3))) & 0xffff;
865 static const int mac_regtosave
[] = {
866 CTRL
, EECD
, EERD
, GPRC
, GPTC
, ICR
, ICS
, IMC
, IMS
,
867 LEDCTL
, MANC
, MDIC
, MPC
, PBA
, RCTL
, RDBAH
, RDBAL
, RDH
,
868 RDLEN
, RDT
, STATUS
, SWSM
, TCTL
, TDBAH
, TDBAL
, TDH
, TDLEN
,
869 TDT
, TORH
, TORL
, TOTH
, TOTL
, TPR
, TPT
, TXDCTL
, WUFC
,
872 enum { MAC_NSAVE
= ARRAY_SIZE(mac_regtosave
) };
874 static const struct {
877 } mac_regarraystosave
[] = { {32, RA
}, {128, MTA
}, {128, VFTA
} };
878 enum { MAC_NARRAYS
= ARRAY_SIZE(mac_regarraystosave
) };
881 nic_save(QEMUFile
*f
, void *opaque
)
883 E1000State
*s
= (E1000State
*)opaque
;
886 pci_device_save(&s
->dev
, f
);
888 qemu_put_be32s(f
, &s
->rxbuf_size
);
889 qemu_put_be32s(f
, &s
->rxbuf_min_shift
);
890 qemu_put_be32s(f
, &s
->eecd_state
.val_in
);
891 qemu_put_be16s(f
, &s
->eecd_state
.bitnum_in
);
892 qemu_put_be16s(f
, &s
->eecd_state
.bitnum_out
);
893 qemu_put_be16s(f
, &s
->eecd_state
.reading
);
894 qemu_put_be32s(f
, &s
->eecd_state
.old_eecd
);
895 qemu_put_8s(f
, &s
->tx
.ipcss
);
896 qemu_put_8s(f
, &s
->tx
.ipcso
);
897 qemu_put_be16s(f
, &s
->tx
.ipcse
);
898 qemu_put_8s(f
, &s
->tx
.tucss
);
899 qemu_put_8s(f
, &s
->tx
.tucso
);
900 qemu_put_be16s(f
, &s
->tx
.tucse
);
901 qemu_put_be32s(f
, &s
->tx
.paylen
);
902 qemu_put_8s(f
, &s
->tx
.hdr_len
);
903 qemu_put_be16s(f
, &s
->tx
.mss
);
904 qemu_put_be16s(f
, &s
->tx
.size
);
905 qemu_put_be16s(f
, &s
->tx
.tso_frames
);
906 qemu_put_8s(f
, &s
->tx
.sum_needed
);
907 qemu_put_s8s(f
, &s
->tx
.ip
);
908 qemu_put_s8s(f
, &s
->tx
.tcp
);
909 qemu_put_buffer(f
, s
->tx
.header
, sizeof s
->tx
.header
);
910 qemu_put_buffer(f
, s
->tx
.data
, sizeof s
->tx
.data
);
911 for (i
= 0; i
< 64; i
++)
912 qemu_put_be16s(f
, s
->eeprom_data
+ i
);
913 for (i
= 0; i
< 0x20; i
++)
914 qemu_put_be16s(f
, s
->phy_reg
+ i
);
915 for (i
= 0; i
< MAC_NSAVE
; i
++)
916 qemu_put_be32s(f
, s
->mac_reg
+ mac_regtosave
[i
]);
917 for (i
= 0; i
< MAC_NARRAYS
; i
++)
918 for (j
= 0; j
< mac_regarraystosave
[i
].size
; j
++)
920 s
->mac_reg
+ mac_regarraystosave
[i
].array0
+ j
);
924 nic_load(QEMUFile
*f
, void *opaque
, int version_id
)
926 E1000State
*s
= (E1000State
*)opaque
;
929 if ((ret
= pci_device_load(&s
->dev
, f
)) < 0)
932 qemu_get_sbe32s(f
, &i
); /* once some unused instance id */
933 qemu_get_be32(f
); /* Ignored. Was mmio_base. */
934 qemu_get_be32s(f
, &s
->rxbuf_size
);
935 qemu_get_be32s(f
, &s
->rxbuf_min_shift
);
936 qemu_get_be32s(f
, &s
->eecd_state
.val_in
);
937 qemu_get_be16s(f
, &s
->eecd_state
.bitnum_in
);
938 qemu_get_be16s(f
, &s
->eecd_state
.bitnum_out
);
939 qemu_get_be16s(f
, &s
->eecd_state
.reading
);
940 qemu_get_be32s(f
, &s
->eecd_state
.old_eecd
);
941 qemu_get_8s(f
, &s
->tx
.ipcss
);
942 qemu_get_8s(f
, &s
->tx
.ipcso
);
943 qemu_get_be16s(f
, &s
->tx
.ipcse
);
944 qemu_get_8s(f
, &s
->tx
.tucss
);
945 qemu_get_8s(f
, &s
->tx
.tucso
);
946 qemu_get_be16s(f
, &s
->tx
.tucse
);
947 qemu_get_be32s(f
, &s
->tx
.paylen
);
948 qemu_get_8s(f
, &s
->tx
.hdr_len
);
949 qemu_get_be16s(f
, &s
->tx
.mss
);
950 qemu_get_be16s(f
, &s
->tx
.size
);
951 qemu_get_be16s(f
, &s
->tx
.tso_frames
);
952 qemu_get_8s(f
, &s
->tx
.sum_needed
);
953 qemu_get_s8s(f
, &s
->tx
.ip
);
954 qemu_get_s8s(f
, &s
->tx
.tcp
);
955 qemu_get_buffer(f
, s
->tx
.header
, sizeof s
->tx
.header
);
956 qemu_get_buffer(f
, s
->tx
.data
, sizeof s
->tx
.data
);
957 for (i
= 0; i
< 64; i
++)
958 qemu_get_be16s(f
, s
->eeprom_data
+ i
);
959 for (i
= 0; i
< 0x20; i
++)
960 qemu_get_be16s(f
, s
->phy_reg
+ i
);
961 for (i
= 0; i
< MAC_NSAVE
; i
++)
962 qemu_get_be32s(f
, s
->mac_reg
+ mac_regtosave
[i
]);
963 for (i
= 0; i
< MAC_NARRAYS
; i
++)
964 for (j
= 0; j
< mac_regarraystosave
[i
].size
; j
++)
966 s
->mac_reg
+ mac_regarraystosave
[i
].array0
+ j
);
970 static const uint16_t e1000_eeprom_template
[64] = {
971 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
972 0x3000, 0x1000, 0x6403, E1000_DEVID
, 0x8086, E1000_DEVID
, 0x8086, 0x3040,
973 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
974 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
975 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
976 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
977 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
978 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
981 static const uint16_t phy_reg_init
[] = {
982 [PHY_CTRL
] = 0x1140, [PHY_STATUS
] = 0x796d, // link initially up
983 [PHY_ID1
] = 0x141, [PHY_ID2
] = PHY_ID2_INIT
,
984 [PHY_1000T_CTRL
] = 0x0e00, [M88E1000_PHY_SPEC_CTRL
] = 0x360,
985 [M88E1000_EXT_PHY_SPEC_CTRL
] = 0x0d60, [PHY_AUTONEG_ADV
] = 0xde1,
986 [PHY_LP_ABILITY
] = 0x1e0, [PHY_1000T_STATUS
] = 0x3c00,
987 [M88E1000_PHY_SPEC_STATUS
] = 0xac00,
990 static const uint32_t mac_reg_init
[] = {
993 [CTRL
] = E1000_CTRL_SWDPIN2
| E1000_CTRL_SWDPIN0
|
994 E1000_CTRL_SPD_1000
| E1000_CTRL_SLU
,
995 [STATUS
] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE
|
996 E1000_STATUS_ASDV
| E1000_STATUS_MTXCKOK
|
997 E1000_STATUS_SPEED_1000
| E1000_STATUS_FD
|
999 [MANC
] = E1000_MANC_EN_MNG2HOST
| E1000_MANC_RCV_TCO_EN
|
1000 E1000_MANC_ARP_EN
| E1000_MANC_0298_EN
|
1006 static CPUWriteMemoryFunc
*e1000_mmio_write
[] = {
1007 e1000_mmio_writeb
, e1000_mmio_writew
, e1000_mmio_writel
1010 static CPUReadMemoryFunc
*e1000_mmio_read
[] = {
1011 e1000_mmio_readb
, e1000_mmio_readw
, e1000_mmio_readl
1015 e1000_mmio_map(PCIDevice
*pci_dev
, int region_num
,
1016 uint32_t addr
, uint32_t size
, int type
)
1018 E1000State
*d
= (E1000State
*)pci_dev
;
1020 const uint32_t excluded_regs
[] = {
1021 E1000_MDIC
, E1000_ICR
, E1000_ICS
, E1000_IMS
,
1022 E1000_IMC
, E1000_TCTL
, E1000_TDT
, PNPMMIO_SIZE
1026 DBGOUT(MMIO
, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr
, size
);
1028 cpu_register_physical_memory(addr
, PNPMMIO_SIZE
, d
->mmio_index
);
1029 qemu_register_coalesced_mmio(addr
, excluded_regs
[0]);
1031 for (i
= 0; excluded_regs
[i
] != PNPMMIO_SIZE
; i
++)
1032 qemu_register_coalesced_mmio(addr
+ excluded_regs
[i
] + 4,
1033 excluded_regs
[i
+ 1] -
1034 excluded_regs
[i
] - 4);
1038 pci_e1000_uninit(PCIDevice
*dev
)
1040 E1000State
*d
= (E1000State
*) dev
;
1042 cpu_unregister_io_memory(d
->mmio_index
);
1048 pci_e1000_init(PCIBus
*bus
, NICInfo
*nd
, int devfn
)
1052 uint16_t checksum
= 0;
1053 static const char info_str
[] = "e1000";
1056 d
= (E1000State
*)pci_register_device(bus
, "e1000",
1057 sizeof(E1000State
), devfn
, NULL
, NULL
);
1059 pci_conf
= d
->dev
.config
;
1060 memset(pci_conf
, 0, 256);
1062 pci_config_set_vendor_id(pci_conf
, PCI_VENDOR_ID_INTEL
);
1063 pci_config_set_device_id(pci_conf
, E1000_DEVID
);
1064 *(uint16_t *)(pci_conf
+0x04) = cpu_to_le16(0x0407);
1065 *(uint16_t *)(pci_conf
+0x06) = cpu_to_le16(0x0010);
1066 pci_conf
[0x08] = 0x03;
1067 pci_config_set_class(pci_conf
, PCI_CLASS_NETWORK_ETHERNET
);
1068 pci_conf
[0x0c] = 0x10;
1070 pci_conf
[0x3d] = 1; // interrupt pin 0
1072 d
->mmio_index
= cpu_register_io_memory(0, e1000_mmio_read
,
1073 e1000_mmio_write
, d
);
1075 pci_register_io_region((PCIDevice
*)d
, 0, PNPMMIO_SIZE
,
1076 PCI_ADDRESS_SPACE_MEM
, e1000_mmio_map
);
1078 pci_register_io_region((PCIDevice
*)d
, 1, IOPORT_SIZE
,
1079 PCI_ADDRESS_SPACE_IO
, ioport_map
);
1082 memmove(d
->eeprom_data
, e1000_eeprom_template
,
1083 sizeof e1000_eeprom_template
);
1084 for (i
= 0; i
< 3; i
++)
1085 d
->eeprom_data
[i
] = (nd
->macaddr
[2*i
+1]<<8) | nd
->macaddr
[2*i
];
1086 for (i
= 0; i
< EEPROM_CHECKSUM_REG
; i
++)
1087 checksum
+= d
->eeprom_data
[i
];
1088 checksum
= (uint16_t) EEPROM_SUM
- checksum
;
1089 d
->eeprom_data
[EEPROM_CHECKSUM_REG
] = checksum
;
1091 memset(d
->phy_reg
, 0, sizeof d
->phy_reg
);
1092 memmove(d
->phy_reg
, phy_reg_init
, sizeof phy_reg_init
);
1093 memset(d
->mac_reg
, 0, sizeof d
->mac_reg
);
1094 memmove(d
->mac_reg
, mac_reg_init
, sizeof mac_reg_init
);
1095 d
->rxbuf_min_shift
= 1;
1096 memset(&d
->tx
, 0, sizeof d
->tx
);
1098 d
->vc
= qemu_new_vlan_client(nd
->vlan
, nd
->model
, nd
->name
,
1099 e1000_receive
, e1000_can_receive
, d
);
1100 d
->vc
->link_status_changed
= e1000_set_link_status
;
1102 qemu_format_nic_info_str(d
->vc
, d
->nd
->macaddr
);
1104 register_savevm(info_str
, -1, 2, nic_save
, nic_load
, d
);
1105 d
->dev
.unregister
= pci_e1000_uninit
;
1107 return (PCIDevice
*)d
;