2 * QEMU i8255x (PRO100) emulation
4 * Copyright (C) 2006-2011 Stefan Weil
6 * Portions of the code are copies from grub / etherboot eepro100.c
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) version 3 or any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 * Tested features (i82559):
23 * PXE boot (i386 guest, i386 / mips / mipsel / ppc host) ok
24 * Linux networking (i386) ok
31 * Intel 8255x 10/100 Mbps Ethernet Controller Family
32 * Open Source Software Developer Manual
35 * * PHY emulation should be separated from nic emulation.
36 * Most nic emulations could share the same phy code.
37 * * i82550 is untested. It is programmed like the i82559.
38 * * i82562 is untested. It is programmed like the i82559.
39 * * Power management (i82558 and later) is not implemented.
40 * * Wake-on-LAN is not implemented.
43 #include <stddef.h> /* offsetof */
47 #include "eeprom93xx.h"
50 /* QEMU sends frames smaller than 60 bytes to ethernet nics.
51 * Such frames are rejected by real nics and their emulations.
52 * To avoid this behaviour, other nic emulations pad received
53 * frames. The following definition enables this padding for
54 * eepro100, too. We keep the define around in case it might
55 * become useful the future if the core networking is ever
56 * changed to pad short packets itself. */
57 #define CONFIG_PAD_RECEIVED_FRAMES
61 /* Debug EEPRO100 card. */
63 # define DEBUG_EEPRO100
67 #define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
69 #define logout(fmt, ...) ((void)0)
72 /* Set flags to 0 to disable debug output. */
73 #define INT 1 /* interrupt related actions */
74 #define MDI 1 /* mdi related actions */
77 #define EEPROM 1 /* eeprom related actions */
79 #define TRACE(flag, command) ((flag) ? (command) : (void)0)
81 #define missing(text) fprintf(stderr, "eepro100: feature is missing in this emulation: " text "\n")
83 #define MAX_ETH_FRAME_SIZE 1514
85 /* This driver supports several different devices which are declared here. */
86 #define i82550 0x82550
87 #define i82551 0x82551
88 #define i82557A 0x82557a
89 #define i82557B 0x82557b
90 #define i82557C 0x82557c
91 #define i82558A 0x82558a
92 #define i82558B 0x82558b
93 #define i82559A 0x82559a
94 #define i82559B 0x82559b
95 #define i82559C 0x82559c
96 #define i82559ER 0x82559e
97 #define i82562 0x82562
98 #define i82801 0x82801
100 /* Use 64 word EEPROM. TODO: could be a runtime option. */
101 #define EEPROM_SIZE 64
103 #define PCI_MEM_SIZE (4 * KiB)
104 #define PCI_IO_SIZE 64
105 #define PCI_FLASH_SIZE (128 * KiB)
107 #define BIT(n) (1 << (n))
108 #define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
110 /* The SCB accepts the following controls for the Tx and Rx units: */
111 #define CU_NOP 0x0000 /* No operation. */
112 #define CU_START 0x0010 /* CU start. */
113 #define CU_RESUME 0x0020 /* CU resume. */
114 #define CU_STATSADDR 0x0040 /* Load dump counters address. */
115 #define CU_SHOWSTATS 0x0050 /* Dump statistical counters. */
116 #define CU_CMD_BASE 0x0060 /* Load CU base address. */
117 #define CU_DUMPSTATS 0x0070 /* Dump and reset statistical counters. */
118 #define CU_SRESUME 0x00a0 /* CU static resume. */
120 #define RU_NOP 0x0000
121 #define RX_START 0x0001
122 #define RX_RESUME 0x0002
123 #define RU_ABORT 0x0004
124 #define RX_ADDR_LOAD 0x0006
125 #define RX_RESUMENR 0x0007
126 #define INT_MASK 0x0100
127 #define DRVR_INT 0x0200 /* Driver generated interrupt. */
135 bool has_extended_tcb_support
;
136 bool power_management
;
139 /* Offsets to the various registers.
140 All accesses need not be longword aligned. */
142 SCBStatus
= 0, /* Status Word. */
144 SCBCmd
= 2, /* Rx/Command Unit command and status. */
146 SCBPointer
= 4, /* General purpose pointer. */
147 SCBPort
= 8, /* Misc. commands and operands. */
148 SCBflash
= 12, /* Flash memory control. */
149 SCBeeprom
= 14, /* EEPROM control. */
150 SCBCtrlMDI
= 16, /* MDI interface control. */
151 SCBEarlyRx
= 20, /* Early receive byte count. */
152 SCBFlow
= 24, /* Flow Control. */
153 SCBpmdr
= 27, /* Power Management Driver. */
154 SCBgctrl
= 28, /* General Control. */
155 SCBgstat
= 29, /* General Status. */
156 } E100RegisterOffset
;
158 /* A speedo3 transmit buffer descriptor with two buffers... */
162 uint32_t link
; /* void * */
163 uint32_t tbd_array_addr
; /* transmit buffer descriptor array address. */
164 uint16_t tcb_bytes
; /* transmit command block byte count (in lower 14 bits */
165 uint8_t tx_threshold
; /* transmit threshold */
166 uint8_t tbd_count
; /* TBD number */
168 /* This constitutes two "TBD" entries: hdr and data */
169 uint32_t tx_buf_addr0
; /* void *, header of frame to be transmitted. */
170 int32_t tx_buf_size0
; /* Length of Tx hdr. */
171 uint32_t tx_buf_addr1
; /* void *, data to be transmitted. */
172 int32_t tx_buf_size1
; /* Length of Tx data. */
176 /* Receive frame descriptor. */
180 uint32_t link
; /* struct RxFD * */
181 uint32_t rx_buf_addr
; /* void * */
184 /* Ethernet frame data follows. */
188 COMMAND_EL
= BIT(15),
193 COMMAND_CMD
= BITS(2, 0),
202 uint32_t tx_good_frames
, tx_max_collisions
, tx_late_collisions
,
203 tx_underruns
, tx_lost_crs
, tx_deferred
, tx_single_collisions
,
204 tx_multiple_collisions
, tx_total_collisions
;
205 uint32_t rx_good_frames
, rx_crc_errors
, rx_alignment_errors
,
206 rx_resource_errors
, rx_overrun_errors
, rx_cdt_errors
,
207 rx_short_frame_errors
;
208 uint32_t fc_xmt_pause
, fc_rcv_pause
, fc_rcv_unsupported
;
209 uint16_t xmt_tco_frames
, rcv_tco_frames
;
210 /* TODO: i82559 has six reserved statistics but a total of 24 dwords. */
211 uint32_t reserved
[4];
231 /* Hash register (multicast mask array, multiple individual addresses). */
236 uint8_t scb_stat
; /* SCB stat/ack byte */
237 uint8_t int_stat
; /* PCI interrupt status */
238 /* region must not be saved by nic_save. */
239 uint32_t region1
; /* PCI region 1 address */
242 uint32_t device
; /* device variant */
244 /* (cu_base + cu_offset) address the next command block in the command block list. */
245 uint32_t cu_base
; /* CU base address */
246 uint32_t cu_offset
; /* CU address offset */
247 /* (ru_base + ru_offset) address the RFD in the Receive Frame Area. */
248 uint32_t ru_base
; /* RU base address */
249 uint32_t ru_offset
; /* RU address offset */
250 uint32_t statsaddr
; /* pointer to eepro100_stats_t */
252 /* Temporary status information (no need to save these values),
253 * used while processing CU commands. */
254 eepro100_tx_t tx
; /* transmit buffer descriptor */
255 uint32_t cb_address
; /* = cu_base + cu_offset */
257 /* Statistical counters. Also used for wake-up packet (i82559). */
258 eepro100_stats_t statistics
;
260 /* Data in mem is always in the byte order of the controller (le).
261 * It must be dword aligned to allow direct access to 32 bit values. */
262 uint8_t mem
[PCI_MEM_SIZE
] __attribute__((aligned(8)));;
264 /* Configuration bytes. */
265 uint8_t configuration
[22];
267 /* vmstate for each particular nic */
268 VMStateDescription
*vmstate
;
270 /* Quasi static device properties (no need to save them). */
272 bool has_extended_tcb_support
;
275 /* Word indices in EEPROM. */
277 EEPROM_CNFG_MDIX
= 0x03,
279 EEPROM_PHY_ID
= 0x06,
280 EEPROM_VENDOR_ID
= 0x0c,
281 EEPROM_CONFIG_ASF
= 0x0d,
282 EEPROM_DEVICE_ID
= 0x23,
283 EEPROM_SMBUS_ADDR
= 0x90,
286 /* Bit values for EEPROM ID word. */
288 EEPROM_ID_MDM
= BIT(0), /* Modem */
289 EEPROM_ID_STB
= BIT(1), /* Standby Enable */
290 EEPROM_ID_WMR
= BIT(2), /* ??? */
291 EEPROM_ID_WOL
= BIT(5), /* Wake on LAN */
292 EEPROM_ID_DPD
= BIT(6), /* Deep Power Down */
293 EEPROM_ID_ALT
= BIT(7), /* */
294 /* BITS(10, 8) device revision */
295 EEPROM_ID_BD
= BIT(11), /* boot disable */
296 EEPROM_ID_ID
= BIT(13), /* id bit */
297 /* BITS(15, 14) signature */
298 EEPROM_ID_VALID
= BIT(14), /* signature for valid eeprom */
301 /* Default values for MDI (PHY) registers */
302 static const uint16_t eepro100_mdi_default
[] = {
303 /* MDI Registers 0 - 6, 7 */
304 0x3000, 0x780d, 0x02a8, 0x0154, 0x05e1, 0x0000, 0x0000, 0x0000,
305 /* MDI Registers 8 - 15 */
306 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
307 /* MDI Registers 16 - 31 */
308 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
309 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
312 /* Readonly mask for MDI (PHY) registers */
313 static const uint16_t eepro100_mdi_mask
[] = {
314 0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
315 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
316 0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
317 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
320 /* Read a 16 bit little endian value from physical memory. */
321 static uint16_t e100_ldw_le_phys(target_phys_addr_t addr
)
323 /* Load 16 bit (little endian) word from emulated hardware. */
325 cpu_physical_memory_read(addr
, &val
, sizeof(val
));
326 return le16_to_cpu(val
);
329 /* Read a 32 bit little endian value from physical memory. */
330 static uint32_t e100_ldl_le_phys(target_phys_addr_t addr
)
332 /* Load 32 bit (little endian) word from emulated hardware. */
334 cpu_physical_memory_read(addr
, &val
, sizeof(val
));
335 return le32_to_cpu(val
);
338 /* Write a 16 bit little endian value to physical memory. */
339 static void e100_stw_le_phys(target_phys_addr_t addr
, uint16_t val
)
341 val
= cpu_to_le16(val
);
342 cpu_physical_memory_write(addr
, &val
, sizeof(val
));
345 /* Write a 32 bit little endian value to physical memory. */
346 static void e100_stl_le_phys(target_phys_addr_t addr
, uint32_t val
)
348 val
= cpu_to_le32(val
);
349 cpu_physical_memory_write(addr
, &val
, sizeof(val
));
352 #define POLYNOMIAL 0x04c11db6
356 static unsigned compute_mcast_idx(const uint8_t * ep
)
363 for (i
= 0; i
< 6; i
++) {
365 for (j
= 0; j
< 8; j
++) {
366 carry
= ((crc
& 0x80000000L
) ?
1 : 0) ^ (b
& 0x01);
370 crc
= ((crc
^ POLYNOMIAL
) | carry
);
374 return (crc
& BITS(7, 2)) >> 2;
377 /* Read a 16 bit control/status (CSR) register. */
378 static uint16_t e100_read_reg2(EEPRO100State
*s
, E100RegisterOffset addr
)
380 assert(!((uintptr_t)&s
->mem
[addr
] & 1));
381 return le16_to_cpup((uint16_t *)&s
->mem
[addr
]);
384 /* Read a 32 bit control/status (CSR) register. */
385 static uint32_t e100_read_reg4(EEPRO100State
*s
, E100RegisterOffset addr
)
387 assert(!((uintptr_t)&s
->mem
[addr
] & 3));
388 return le32_to_cpup((uint32_t *)&s
->mem
[addr
]);
391 /* Write a 16 bit control/status (CSR) register. */
392 static void e100_write_reg2(EEPRO100State
*s
, E100RegisterOffset addr
,
395 assert(!((uintptr_t)&s
->mem
[addr
] & 1));
396 cpu_to_le16w((uint16_t *)&s
->mem
[addr
], val
);
399 /* Read a 32 bit control/status (CSR) register. */
400 static void e100_write_reg4(EEPRO100State
*s
, E100RegisterOffset addr
,
403 assert(!((uintptr_t)&s
->mem
[addr
] & 3));
404 cpu_to_le32w((uint32_t *)&s
->mem
[addr
], val
);
407 #if defined(DEBUG_EEPRO100)
408 static const char *nic_dump(const uint8_t * buf
, unsigned size
)
410 static char dump
[3 * 16 + 1];
416 p
+= sprintf(p
, " %02x", *buf
++);
420 #endif /* DEBUG_EEPRO100 */
423 stat_ack_not_ours
= 0x00,
424 stat_ack_sw_gen
= 0x04,
426 stat_ack_cu_idle
= 0x20,
427 stat_ack_frame_rx
= 0x40,
428 stat_ack_cu_cmd_done
= 0x80,
429 stat_ack_not_present
= 0xFF,
430 stat_ack_rx
= (stat_ack_sw_gen
| stat_ack_rnr
| stat_ack_frame_rx
),
431 stat_ack_tx
= (stat_ack_cu_idle
| stat_ack_cu_cmd_done
),
434 static void disable_interrupt(EEPRO100State
* s
)
437 TRACE(INT
, logout("interrupt disabled\n"));
438 qemu_irq_lower(s
->dev
.irq
[0]);
443 static void enable_interrupt(EEPRO100State
* s
)
446 TRACE(INT
, logout("interrupt enabled\n"));
447 qemu_irq_raise(s
->dev
.irq
[0]);
452 static void eepro100_acknowledge(EEPRO100State
* s
)
454 s
->scb_stat
&= ~s
->mem
[SCBAck
];
455 s
->mem
[SCBAck
] = s
->scb_stat
;
456 if (s
->scb_stat
== 0) {
457 disable_interrupt(s
);
461 static void eepro100_interrupt(EEPRO100State
* s
, uint8_t status
)
463 uint8_t mask
= ~s
->mem
[SCBIntmask
];
464 s
->mem
[SCBAck
] |= status
;
465 status
= s
->scb_stat
= s
->mem
[SCBAck
];
466 status
&= (mask
| 0x0f);
468 status
&= (~s
->mem
[SCBIntmask
] | 0x0xf
);
470 if (status
&& (mask
& 0x01)) {
471 /* SCB mask and SCB Bit M do not disable interrupt. */
473 } else if (s
->int_stat
) {
474 disable_interrupt(s
);
478 static void eepro100_cx_interrupt(EEPRO100State
* s
)
480 /* CU completed action command. */
481 /* Transmit not ok (82557 only, not in emulation). */
482 eepro100_interrupt(s
, 0x80);
485 static void eepro100_cna_interrupt(EEPRO100State
* s
)
487 /* CU left the active state. */
488 eepro100_interrupt(s
, 0x20);
491 static void eepro100_fr_interrupt(EEPRO100State
* s
)
493 /* RU received a complete frame. */
494 eepro100_interrupt(s
, 0x40);
497 static void eepro100_rnr_interrupt(EEPRO100State
* s
)
499 /* RU is not ready. */
500 eepro100_interrupt(s
, 0x10);
503 static void eepro100_mdi_interrupt(EEPRO100State
* s
)
505 /* MDI completed read or write cycle. */
506 eepro100_interrupt(s
, 0x08);
509 static void eepro100_swi_interrupt(EEPRO100State
* s
)
511 /* Software has requested an interrupt. */
512 eepro100_interrupt(s
, 0x04);
516 static void eepro100_fcp_interrupt(EEPRO100State
* s
)
518 /* Flow control pause interrupt (82558 and later). */
519 eepro100_interrupt(s
, 0x01);
523 static void e100_pci_reset(EEPRO100State
* s
, E100PCIDeviceInfo
*e100_device
)
525 uint32_t device
= s
->device
;
526 uint8_t *pci_conf
= s
->dev
.config
;
528 TRACE(OTHER
, logout("%p\n", s
));
531 pci_config_set_vendor_id(pci_conf
, PCI_VENDOR_ID_INTEL
);
533 pci_config_set_device_id(pci_conf
, e100_device
->device_id
);
535 pci_set_word(pci_conf
+ PCI_STATUS
, PCI_STATUS_DEVSEL_MEDIUM
|
536 PCI_STATUS_FAST_BACK
);
537 /* PCI Revision ID */
538 pci_config_set_revision(pci_conf
, e100_device
->revision
);
539 pci_config_set_class(pci_conf
, PCI_CLASS_NETWORK_ETHERNET
);
540 /* PCI Latency Timer */
541 pci_set_byte(pci_conf
+ PCI_LATENCY_TIMER
, 0x20); /* latency timer = 32 clocks */
542 /* Capability Pointer is set by PCI framework. */
545 pci_set_byte(pci_conf
+ PCI_INTERRUPT_PIN
, 1); /* interrupt pin A */
547 pci_set_byte(pci_conf
+ PCI_MIN_GNT
, 0x08);
548 /* Maximum Latency */
549 pci_set_byte(pci_conf
+ PCI_MAX_LAT
, 0x18);
551 s
->stats_size
= e100_device
->stats_size
;
552 s
->has_extended_tcb_support
= e100_device
->has_extended_tcb_support
;
570 pci_set_word(pci_conf
+ PCI_SUBSYSTEM_VENDOR_ID
, PCI_VENDOR_ID_INTEL
);
571 pci_set_word(pci_conf
+ PCI_SUBSYSTEM_ID
, 0x0040);
575 logout("Device %X is undefined!\n", device
);
579 s
->configuration
[6] |= BIT(4);
581 /* Standard statistical counters. */
582 s
->configuration
[6] |= BIT(5);
584 if (s
->stats_size
== 80) {
585 /* TODO: check TCO Statistical Counters bit. Documentation not clear. */
586 if (s
->configuration
[6] & BIT(2)) {
587 /* TCO statistical counters. */
588 assert(s
->configuration
[6] & BIT(5));
590 if (s
->configuration
[6] & BIT(5)) {
591 /* No extended statistical counters, i82557 compatible. */
594 /* i82558 compatible. */
599 if (s
->configuration
[6] & BIT(5)) {
600 /* No extended statistical counters. */
604 assert(s
->stats_size
> 0 && s
->stats_size
<= sizeof(s
->statistics
));
606 if (e100_device
->power_management
) {
607 /* Power Management Capabilities */
608 int cfg_offset
= 0xdc;
609 int r
= pci_add_capability(&s
->dev
, PCI_CAP_ID_PM
,
610 cfg_offset
, PCI_PM_SIZEOF
);
612 pci_set_word(pci_conf
+ cfg_offset
+ PCI_PM_PMC
, 0x7e21);
613 #if 0 /* TODO: replace dummy code for power management emulation. */
614 /* TODO: Power Management Control / Status. */
615 pci_set_word(pci_conf
+ cfg_offset
+ PCI_PM_CTRL
, 0x0000);
616 /* TODO: Ethernet Power Consumption Registers (i82559 and later). */
617 pci_set_byte(pci_conf
+ cfg_offset
+ PCI_PM_PPB_EXTENSIONS
, 0x0000);
622 if (device
== i82557C
|| device
== i82558B
|| device
== i82559C
) {
624 TODO: get vendor id from EEPROM for i82557C or later.
625 TODO: get device id from EEPROM for i82557C or later.
626 TODO: status bit 4 can be disabled by EEPROM for i82558, i82559.
627 TODO: header type is determined by EEPROM for i82559.
628 TODO: get subsystem id from EEPROM for i82557C or later.
629 TODO: get subsystem vendor id from EEPROM for i82557C or later.
630 TODO: exp. rom baddr depends on a bit in EEPROM for i82558 or later.
631 TODO: capability pointer depends on EEPROM for i82558.
633 logout("Get device id and revision from EEPROM!!!\n");
635 #endif /* EEPROM_SIZE > 0 */
638 static void nic_selective_reset(EEPRO100State
* s
)
641 uint16_t *eeprom_contents
= eeprom93xx_data(s
->eeprom
);
643 eeprom93xx_reset(s
->eeprom
);
645 memcpy(eeprom_contents
, s
->conf
.macaddr
.a
, 6);
646 eeprom_contents
[EEPROM_ID
] = EEPROM_ID_VALID
;
647 if (s
->device
== i82557B
|| s
->device
== i82557C
)
648 eeprom_contents
[5] = 0x0100;
649 eeprom_contents
[EEPROM_PHY_ID
] = 1;
651 for (i
= 0; i
< EEPROM_SIZE
- 1; i
++) {
652 sum
+= eeprom_contents
[i
];
654 eeprom_contents
[EEPROM_SIZE
- 1] = 0xbaba - sum
;
655 TRACE(EEPROM
, logout("checksum=0x%04x\n", eeprom_contents
[EEPROM_SIZE
- 1]));
657 memset(s
->mem
, 0, sizeof(s
->mem
));
658 e100_write_reg4(s
, SCBCtrlMDI
, BIT(21));
660 assert(sizeof(s
->mdimem
) == sizeof(eepro100_mdi_default
));
661 memcpy(&s
->mdimem
[0], &eepro100_mdi_default
[0], sizeof(s
->mdimem
));
664 static void nic_reset(void *opaque
)
666 EEPRO100State
*s
= opaque
;
667 TRACE(OTHER
, logout("%p\n", s
));
668 /* TODO: Clearing of hash register for selective reset, too? */
669 memset(&s
->mult
[0], 0, sizeof(s
->mult
));
670 nic_selective_reset(s
);
673 #if defined(DEBUG_EEPRO100)
674 static const char * const e100_reg
[PCI_IO_SIZE
/ 4] = {
678 "EEPROM/Flash Control",
680 "Receive DMA Byte Count",
682 "General Status/Control"
685 static char *regname(uint32_t addr
)
688 if (addr
< PCI_IO_SIZE
) {
689 const char *r
= e100_reg
[addr
/ 4];
691 snprintf(buf
, sizeof(buf
), "%s+%u", r
, addr
% 4);
693 snprintf(buf
, sizeof(buf
), "0x%02x", addr
);
696 snprintf(buf
, sizeof(buf
), "??? 0x%08x", addr
);
700 #endif /* DEBUG_EEPRO100 */
702 /*****************************************************************************
706 ****************************************************************************/
709 static uint16_t eepro100_read_command(EEPRO100State
* s
)
711 uint16_t val
= 0xffff;
712 TRACE(OTHER
, logout("val=0x%04x\n", val
));
717 /* Commands that can be put in a command list entry. */
722 CmdMulticastList
= 3,
724 CmdTDR
= 5, /* load microcode */
728 /* And some extra flags: */
729 CmdSuspend
= 0x4000, /* Suspend after completion. */
730 CmdIntr
= 0x2000, /* Interrupt after completion. */
731 CmdTxFlex
= 0x0008, /* Use "Flexible mode" for CmdTx command. */
734 static cu_state_t
get_cu_state(EEPRO100State
* s
)
736 return ((s
->mem
[SCBStatus
] & BITS(7, 6)) >> 6);
739 static void set_cu_state(EEPRO100State
* s
, cu_state_t state
)
741 s
->mem
[SCBStatus
] = (s
->mem
[SCBStatus
] & ~BITS(7, 6)) + (state
<< 6);
744 static ru_state_t
get_ru_state(EEPRO100State
* s
)
746 return ((s
->mem
[SCBStatus
] & BITS(5, 2)) >> 2);
749 static void set_ru_state(EEPRO100State
* s
, ru_state_t state
)
751 s
->mem
[SCBStatus
] = (s
->mem
[SCBStatus
] & ~BITS(5, 2)) + (state
<< 2);
754 static void dump_statistics(EEPRO100State
* s
)
756 /* Dump statistical data. Most data is never changed by the emulation
757 * and always 0, so we first just copy the whole block and then those
758 * values which really matter.
759 * Number of data should check configuration!!!
761 cpu_physical_memory_write(s
->statsaddr
, &s
->statistics
, s
->stats_size
);
762 e100_stl_le_phys(s
->statsaddr
+ 0, s
->statistics
.tx_good_frames
);
763 e100_stl_le_phys(s
->statsaddr
+ 36, s
->statistics
.rx_good_frames
);
764 e100_stl_le_phys(s
->statsaddr
+ 48, s
->statistics
.rx_resource_errors
);
765 e100_stl_le_phys(s
->statsaddr
+ 60, s
->statistics
.rx_short_frame_errors
);
767 e100_stw_le_phys(s
->statsaddr
+ 76, s
->statistics
.xmt_tco_frames
);
768 e100_stw_le_phys(s
->statsaddr
+ 78, s
->statistics
.rcv_tco_frames
);
769 missing("CU dump statistical counters");
773 static void read_cb(EEPRO100State
*s
)
775 cpu_physical_memory_read(s
->cb_address
, &s
->tx
, sizeof(s
->tx
));
776 s
->tx
.status
= le16_to_cpu(s
->tx
.status
);
777 s
->tx
.command
= le16_to_cpu(s
->tx
.command
);
778 s
->tx
.link
= le32_to_cpu(s
->tx
.link
);
779 s
->tx
.tbd_array_addr
= le32_to_cpu(s
->tx
.tbd_array_addr
);
780 s
->tx
.tcb_bytes
= le16_to_cpu(s
->tx
.tcb_bytes
);
783 static void tx_command(EEPRO100State
*s
)
785 uint32_t tbd_array
= le32_to_cpu(s
->tx
.tbd_array_addr
);
786 uint16_t tcb_bytes
= (le16_to_cpu(s
->tx
.tcb_bytes
) & 0x3fff);
787 /* Sends larger than MAX_ETH_FRAME_SIZE are allowed, up to 2600 bytes. */
790 uint32_t tbd_address
= s
->cb_address
+ 0x10;
792 ("transmit, TBD array address 0x%08x, TCB byte count 0x%04x, TBD count %u\n",
793 tbd_array
, tcb_bytes
, s
->tx
.tbd_count
));
795 if (tcb_bytes
> 2600) {
796 logout("TCB byte count too large, using 2600\n");
799 if (!((tcb_bytes
> 0) || (tbd_array
!= 0xffffffff))) {
801 ("illegal values of TBD array address and TCB byte count!\n");
803 assert(tcb_bytes
<= sizeof(buf
));
804 while (size
< tcb_bytes
) {
805 uint32_t tx_buffer_address
= e100_ldl_le_phys(tbd_address
);
806 uint16_t tx_buffer_size
= e100_ldw_le_phys(tbd_address
+ 4);
808 uint16_t tx_buffer_el
= e100_ldw_le_phys(tbd_address
+ 6);
812 ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
813 tx_buffer_address
, tx_buffer_size
));
814 tx_buffer_size
= MIN(tx_buffer_size
, sizeof(buf
) - size
);
815 cpu_physical_memory_read(tx_buffer_address
, &buf
[size
],
817 size
+= tx_buffer_size
;
819 if (tbd_array
== 0xffffffff) {
820 /* Simplified mode. Was already handled by code above. */
823 uint8_t tbd_count
= 0;
824 if (s
->has_extended_tcb_support
&& !(s
->configuration
[6] & BIT(4))) {
825 /* Extended Flexible TCB. */
826 for (; tbd_count
< 2; tbd_count
++) {
827 uint32_t tx_buffer_address
= e100_ldl_le_phys(tbd_address
);
828 uint16_t tx_buffer_size
= e100_ldw_le_phys(tbd_address
+ 4);
829 uint16_t tx_buffer_el
= e100_ldw_le_phys(tbd_address
+ 6);
832 ("TBD (extended flexible mode): buffer address 0x%08x, size 0x%04x\n",
833 tx_buffer_address
, tx_buffer_size
));
834 tx_buffer_size
= MIN(tx_buffer_size
, sizeof(buf
) - size
);
835 cpu_physical_memory_read(tx_buffer_address
, &buf
[size
],
837 size
+= tx_buffer_size
;
838 if (tx_buffer_el
& 1) {
843 tbd_address
= tbd_array
;
844 for (; tbd_count
< s
->tx
.tbd_count
; tbd_count
++) {
845 uint32_t tx_buffer_address
= e100_ldl_le_phys(tbd_address
);
846 uint16_t tx_buffer_size
= e100_ldw_le_phys(tbd_address
+ 4);
847 uint16_t tx_buffer_el
= e100_ldw_le_phys(tbd_address
+ 6);
850 ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
851 tx_buffer_address
, tx_buffer_size
));
852 tx_buffer_size
= MIN(tx_buffer_size
, sizeof(buf
) - size
);
853 cpu_physical_memory_read(tx_buffer_address
, &buf
[size
],
855 size
+= tx_buffer_size
;
856 if (tx_buffer_el
& 1) {
861 TRACE(RXTX
, logout("%p sending frame, len=%d,%s\n", s
, size
, nic_dump(buf
, size
)));
862 qemu_send_packet(&s
->nic
->nc
, buf
, size
);
863 s
->statistics
.tx_good_frames
++;
864 /* Transmit with bad status would raise an CX/TNO interrupt.
865 * (82557 only). Emulation never has bad status. */
867 eepro100_cx_interrupt(s
);
871 static void set_multicast_list(EEPRO100State
*s
)
873 uint16_t multicast_count
= s
->tx
.tbd_array_addr
& BITS(13, 0);
875 memset(&s
->mult
[0], 0, sizeof(s
->mult
));
876 TRACE(OTHER
, logout("multicast list, multicast count = %u\n", multicast_count
));
877 for (i
= 0; i
< multicast_count
; i
+= 6) {
878 uint8_t multicast_addr
[6];
879 cpu_physical_memory_read(s
->cb_address
+ 10 + i
, multicast_addr
, 6);
880 TRACE(OTHER
, logout("multicast entry %s\n", nic_dump(multicast_addr
, 6)));
881 unsigned mcast_idx
= compute_mcast_idx(multicast_addr
);
882 assert(mcast_idx
< 64);
883 s
->mult
[mcast_idx
>> 3] |= (1 << (mcast_idx
& 7));
887 static void action_command(EEPRO100State
*s
)
894 uint16_t ok_status
= STATUS_OK
;
895 s
->cb_address
= s
->cu_base
+ s
->cu_offset
;
897 bit_el
= ((s
->tx
.command
& COMMAND_EL
) != 0);
898 bit_s
= ((s
->tx
.command
& COMMAND_S
) != 0);
899 bit_i
= ((s
->tx
.command
& COMMAND_I
) != 0);
900 bit_nc
= ((s
->tx
.command
& COMMAND_NC
) != 0);
902 bool bit_sf
= ((s
->tx
.command
& COMMAND_SF
) != 0);
904 s
->cu_offset
= s
->tx
.link
;
906 logout("val=(cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
907 s
->tx
.status
, s
->tx
.command
, s
->tx
.link
));
908 switch (s
->tx
.command
& COMMAND_CMD
) {
913 cpu_physical_memory_read(s
->cb_address
+ 8, &s
->conf
.macaddr
.a
[0], 6);
914 TRACE(OTHER
, logout("macaddr: %s\n", nic_dump(&s
->conf
.macaddr
.a
[0], 6)));
917 cpu_physical_memory_read(s
->cb_address
+ 8, &s
->configuration
[0],
918 sizeof(s
->configuration
));
919 TRACE(OTHER
, logout("configuration: %s\n",
920 nic_dump(&s
->configuration
[0], 16)));
921 TRACE(OTHER
, logout("configuration: %s\n",
922 nic_dump(&s
->configuration
[16],
923 ARRAY_SIZE(s
->configuration
) - 16)));
924 if (s
->configuration
[20] & BIT(6)) {
925 TRACE(OTHER
, logout("Multiple IA bit\n"));
928 case CmdMulticastList
:
929 set_multicast_list(s
);
933 missing("CmdTx: NC = 0");
940 TRACE(OTHER
, logout("load microcode\n"));
941 /* Starting with offset 8, the command contains
942 * 64 dwords microcode which we just ignore here. */
945 TRACE(OTHER
, logout("diagnose\n"));
946 /* Make sure error flag is not set. */
950 missing("undefined command");
954 /* Write new status. */
955 e100_stw_le_phys(s
->cb_address
, s
->tx
.status
| ok_status
| STATUS_C
);
957 /* CU completed action. */
958 eepro100_cx_interrupt(s
);
961 /* CU becomes idle. Terminate command loop. */
962 set_cu_state(s
, cu_idle
);
963 eepro100_cna_interrupt(s
);
966 /* CU becomes suspended. Terminate command loop. */
967 set_cu_state(s
, cu_suspended
);
968 eepro100_cna_interrupt(s
);
971 /* More entries in list. */
972 TRACE(OTHER
, logout("CU list with at least one more entry\n"));
975 TRACE(OTHER
, logout("CU list empty\n"));
976 /* List is empty. Now CU is idle or suspended. */
979 static void eepro100_cu_command(EEPRO100State
* s
, uint8_t val
)
987 cu_state
= get_cu_state(s
);
988 if (cu_state
!= cu_idle
&& cu_state
!= cu_suspended
) {
989 /* Intel documentation says that CU must be idle or suspended
990 * for the CU start command. */
991 logout("unexpected CU state is %u\n", cu_state
);
993 set_cu_state(s
, cu_active
);
994 s
->cu_offset
= s
->pointer
;
998 if (get_cu_state(s
) != cu_suspended
) {
999 logout("bad CU resume from CU state %u\n", get_cu_state(s
));
1000 /* Workaround for bad Linux eepro100 driver which resumes
1001 * from idle state. */
1003 missing("cu resume");
1005 set_cu_state(s
, cu_suspended
);
1007 if (get_cu_state(s
) == cu_suspended
) {
1008 TRACE(OTHER
, logout("CU resuming\n"));
1009 set_cu_state(s
, cu_active
);
1014 /* Load dump counters address. */
1015 s
->statsaddr
= s
->pointer
;
1016 TRACE(OTHER
, logout("val=0x%02x (status address)\n", val
));
1019 /* Dump statistical counters. */
1020 TRACE(OTHER
, logout("val=0x%02x (dump stats)\n", val
));
1022 e100_stl_le_phys(s
->statsaddr
+ s
->stats_size
, 0xa005);
1026 TRACE(OTHER
, logout("val=0x%02x (CU base address)\n", val
));
1027 s
->cu_base
= s
->pointer
;
1030 /* Dump and reset statistical counters. */
1031 TRACE(OTHER
, logout("val=0x%02x (dump stats and reset)\n", val
));
1033 e100_stl_le_phys(s
->statsaddr
+ s
->stats_size
, 0xa007);
1034 memset(&s
->statistics
, 0, sizeof(s
->statistics
));
1037 /* CU static resume. */
1038 missing("CU static resume");
1041 missing("Undefined CU command");
1045 static void eepro100_ru_command(EEPRO100State
* s
, uint8_t val
)
1053 if (get_ru_state(s
) != ru_idle
) {
1054 logout("RU state is %u, should be %u\n", get_ru_state(s
), ru_idle
);
1056 assert(!"wrong RU state");
1059 set_ru_state(s
, ru_ready
);
1060 s
->ru_offset
= s
->pointer
;
1061 TRACE(OTHER
, logout("val=0x%02x (rx start)\n", val
));
1065 if (get_ru_state(s
) != ru_suspended
) {
1066 logout("RU state is %u, should be %u\n", get_ru_state(s
),
1069 assert(!"wrong RU state");
1072 set_ru_state(s
, ru_ready
);
1076 if (get_ru_state(s
) == ru_ready
) {
1077 eepro100_rnr_interrupt(s
);
1079 set_ru_state(s
, ru_idle
);
1083 TRACE(OTHER
, logout("val=0x%02x (RU base address)\n", val
));
1084 s
->ru_base
= s
->pointer
;
1087 logout("val=0x%02x (undefined RU command)\n", val
);
1088 missing("Undefined SU command");
1092 static void eepro100_write_command(EEPRO100State
* s
, uint8_t val
)
1094 eepro100_ru_command(s
, val
& 0x0f);
1095 eepro100_cu_command(s
, val
& 0xf0);
1097 TRACE(OTHER
, logout("val=0x%02x\n", val
));
1099 /* Clear command byte after command was accepted. */
1103 /*****************************************************************************
1107 ****************************************************************************/
1109 #define EEPROM_CS 0x02
1110 #define EEPROM_SK 0x01
1111 #define EEPROM_DI 0x04
1112 #define EEPROM_DO 0x08
1114 static uint16_t eepro100_read_eeprom(EEPRO100State
* s
)
1116 uint16_t val
= e100_read_reg2(s
, SCBeeprom
);
1117 if (eeprom93xx_read(s
->eeprom
)) {
1122 TRACE(EEPROM
, logout("val=0x%04x\n", val
));
1126 static void eepro100_write_eeprom(eeprom_t
* eeprom
, uint8_t val
)
1128 TRACE(EEPROM
, logout("val=0x%02x\n", val
));
1130 /* mask unwriteable bits */
1132 val
= SET_MASKED(val
, 0x31, eeprom
->value
);
1135 int eecs
= ((val
& EEPROM_CS
) != 0);
1136 int eesk
= ((val
& EEPROM_SK
) != 0);
1137 int eedi
= ((val
& EEPROM_DI
) != 0);
1138 eeprom93xx_write(eeprom
, eecs
, eesk
, eedi
);
1141 static void eepro100_write_pointer(EEPRO100State
* s
, uint32_t val
)
1143 s
->pointer
= le32_to_cpu(val
);
1144 TRACE(OTHER
, logout("val=0x%08x\n", val
));
1147 /*****************************************************************************
1151 ****************************************************************************/
1153 #if defined(DEBUG_EEPRO100)
1154 static const char * const mdi_op_name
[] = {
1161 static const char * const mdi_reg_name
[] = {
1164 "PHY Identification (Word 1)",
1165 "PHY Identification (Word 2)",
1166 "Auto-Negotiation Advertisement",
1167 "Auto-Negotiation Link Partner Ability",
1168 "Auto-Negotiation Expansion"
1171 static const char *reg2name(uint8_t reg
)
1173 static char buffer
[10];
1174 const char *p
= buffer
;
1175 if (reg
< ARRAY_SIZE(mdi_reg_name
)) {
1176 p
= mdi_reg_name
[reg
];
1178 snprintf(buffer
, sizeof(buffer
), "reg=0x%02x", reg
);
1182 #endif /* DEBUG_EEPRO100 */
1184 static uint32_t eepro100_read_mdi(EEPRO100State
* s
)
1186 uint32_t val
= e100_read_reg4(s
, SCBCtrlMDI
);
1188 #ifdef DEBUG_EEPRO100
1189 uint8_t raiseint
= (val
& BIT(29)) >> 29;
1190 uint8_t opcode
= (val
& BITS(27, 26)) >> 26;
1191 uint8_t phy
= (val
& BITS(25, 21)) >> 21;
1192 uint8_t reg
= (val
& BITS(20, 16)) >> 16;
1193 uint16_t data
= (val
& BITS(15, 0));
1195 /* Emulation takes no time to finish MDI transaction. */
1197 TRACE(MDI
, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1198 val
, raiseint
, mdi_op_name
[opcode
], phy
,
1199 reg2name(reg
), data
));
1203 static void eepro100_write_mdi(EEPRO100State
* s
, uint32_t val
)
1205 uint8_t raiseint
= (val
& BIT(29)) >> 29;
1206 uint8_t opcode
= (val
& BITS(27, 26)) >> 26;
1207 uint8_t phy
= (val
& BITS(25, 21)) >> 21;
1208 uint8_t reg
= (val
& BITS(20, 16)) >> 16;
1209 uint16_t data
= (val
& BITS(15, 0));
1210 TRACE(MDI
, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1211 val
, raiseint
, mdi_op_name
[opcode
], phy
, reg2name(reg
), data
));
1213 /* Unsupported PHY address. */
1215 logout("phy must be 1 but is %u\n", phy
);
1218 } else if (opcode
!= 1 && opcode
!= 2) {
1219 /* Unsupported opcode. */
1220 logout("opcode must be 1 or 2 but is %u\n", opcode
);
1222 } else if (reg
> 6) {
1223 /* Unsupported register. */
1224 logout("register must be 0...6 but is %u\n", reg
);
1227 TRACE(MDI
, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1228 val
, raiseint
, mdi_op_name
[opcode
], phy
,
1229 reg2name(reg
), data
));
1233 case 0: /* Control Register */
1234 if (data
& 0x8000) {
1235 /* Reset status and control registers to default. */
1236 s
->mdimem
[0] = eepro100_mdi_default
[0];
1237 s
->mdimem
[1] = eepro100_mdi_default
[1];
1238 data
= s
->mdimem
[reg
];
1240 /* Restart Auto Configuration = Normal Operation */
1244 case 1: /* Status Register */
1245 missing("not writable");
1246 data
= s
->mdimem
[reg
];
1248 case 2: /* PHY Identification Register (Word 1) */
1249 case 3: /* PHY Identification Register (Word 2) */
1250 missing("not implemented");
1252 case 4: /* Auto-Negotiation Advertisement Register */
1253 case 5: /* Auto-Negotiation Link Partner Ability Register */
1255 case 6: /* Auto-Negotiation Expansion Register */
1257 missing("not implemented");
1259 s
->mdimem
[reg
] = data
;
1260 } else if (opcode
== 2) {
1263 case 0: /* Control Register */
1264 if (data
& 0x8000) {
1265 /* Reset status and control registers to default. */
1266 s
->mdimem
[0] = eepro100_mdi_default
[0];
1267 s
->mdimem
[1] = eepro100_mdi_default
[1];
1270 case 1: /* Status Register */
1271 s
->mdimem
[reg
] |= 0x0020;
1273 case 2: /* PHY Identification Register (Word 1) */
1274 case 3: /* PHY Identification Register (Word 2) */
1275 case 4: /* Auto-Negotiation Advertisement Register */
1277 case 5: /* Auto-Negotiation Link Partner Ability Register */
1278 s
->mdimem
[reg
] = 0x41fe;
1280 case 6: /* Auto-Negotiation Expansion Register */
1281 s
->mdimem
[reg
] = 0x0001;
1284 data
= s
->mdimem
[reg
];
1286 /* Emulation takes no time to finish MDI transaction.
1287 * Set MDI bit in SCB status register. */
1288 s
->mem
[SCBAck
] |= 0x08;
1291 eepro100_mdi_interrupt(s
);
1294 val
= (val
& 0xffff0000) + data
;
1295 e100_write_reg4(s
, SCBCtrlMDI
, val
);
1298 /*****************************************************************************
1302 ****************************************************************************/
1304 #define PORT_SOFTWARE_RESET 0
1305 #define PORT_SELFTEST 1
1306 #define PORT_SELECTIVE_RESET 2
1308 #define PORT_SELECTION_MASK 3
1311 uint32_t st_sign
; /* Self Test Signature */
1312 uint32_t st_result
; /* Self Test Results */
1313 } eepro100_selftest_t
;
1315 static uint32_t eepro100_read_port(EEPRO100State
* s
)
1320 static void eepro100_write_port(EEPRO100State
*s
)
1322 uint32_t val
= e100_read_reg4(s
, SCBPort
);
1323 uint32_t address
= (val
& ~PORT_SELECTION_MASK
);
1324 uint8_t selection
= (val
& PORT_SELECTION_MASK
);
1325 switch (selection
) {
1326 case PORT_SOFTWARE_RESET
:
1330 TRACE(OTHER
, logout("selftest address=0x%08x\n", address
));
1331 eepro100_selftest_t data
;
1332 cpu_physical_memory_read(address
, &data
, sizeof(data
));
1333 data
.st_sign
= 0xffffffff;
1335 cpu_physical_memory_write(address
, &data
, sizeof(data
));
1337 case PORT_SELECTIVE_RESET
:
1338 TRACE(OTHER
, logout("selective reset, selftest address=0x%08x\n", address
));
1339 nic_selective_reset(s
);
1342 logout("val=0x%08x\n", val
);
1343 missing("unknown port selection");
1347 /*****************************************************************************
1349 * General hardware emulation.
1351 ****************************************************************************/
1353 static uint8_t eepro100_read1(EEPRO100State
* s
, uint32_t addr
)
1356 if (addr
<= sizeof(s
->mem
) - sizeof(val
)) {
1363 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1366 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1368 val
= eepro100_read_command(s
);
1372 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1375 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1378 val
= eepro100_read_eeprom(s
);
1380 case SCBpmdr
: /* Power Management Driver Register */
1382 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1384 case SCBgstat
: /* General Status Register */
1385 /* 100 Mbps full duplex, valid link */
1387 TRACE(OTHER
, logout("addr=General Status val=%02x\n", val
));
1390 logout("addr=%s val=0x%02x\n", regname(addr
), val
);
1391 missing("unknown byte read");
1396 static uint16_t eepro100_read2(EEPRO100State
* s
, uint32_t addr
)
1399 if (addr
<= sizeof(s
->mem
) - sizeof(val
)) {
1400 val
= e100_read_reg2(s
, addr
);
1406 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1409 val
= eepro100_read_eeprom(s
);
1410 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1413 logout("addr=%s val=0x%04x\n", regname(addr
), val
);
1414 missing("unknown word read");
1419 static uint32_t eepro100_read4(EEPRO100State
* s
, uint32_t addr
)
1422 if (addr
<= sizeof(s
->mem
) - sizeof(val
)) {
1423 val
= e100_read_reg4(s
, addr
);
1428 TRACE(OTHER
, logout("addr=%s val=0x%08x\n", regname(addr
), val
));
1432 val
= eepro100_read_pointer(s
);
1434 TRACE(OTHER
, logout("addr=%s val=0x%08x\n", regname(addr
), val
));
1437 val
= eepro100_read_port(s
);
1438 TRACE(OTHER
, logout("addr=%s val=0x%08x\n", regname(addr
), val
));
1441 val
= eepro100_read_mdi(s
);
1444 logout("addr=%s val=0x%08x\n", regname(addr
), val
);
1445 missing("unknown longword read");
1450 static void eepro100_write1(EEPRO100State
* s
, uint32_t addr
, uint8_t val
)
1452 /* SCBStatus is readonly. */
1453 if (addr
> SCBStatus
&& addr
<= sizeof(s
->mem
) - sizeof(val
)) {
1459 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1462 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1463 eepro100_acknowledge(s
);
1466 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1467 eepro100_write_command(s
, val
);
1470 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1472 eepro100_swi_interrupt(s
);
1474 eepro100_interrupt(s
, 0);
1479 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1482 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1483 eepro100_write_port(s
);
1485 case SCBFlow
: /* does not exist on 82557 */
1488 case SCBpmdr
: /* does not exist on 82557 */
1489 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1492 TRACE(OTHER
, logout("addr=%s val=0x%02x\n", regname(addr
), val
));
1493 eepro100_write_eeprom(s
->eeprom
, val
);
1496 logout("addr=%s val=0x%02x\n", regname(addr
), val
);
1497 missing("unknown byte write");
1501 static void eepro100_write2(EEPRO100State
* s
, uint32_t addr
, uint16_t val
)
1503 /* SCBStatus is readonly. */
1504 if (addr
> SCBStatus
&& addr
<= sizeof(s
->mem
) - sizeof(val
)) {
1505 e100_write_reg2(s
, addr
, val
);
1510 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1511 s
->mem
[SCBAck
] = (val
>> 8);
1512 eepro100_acknowledge(s
);
1515 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1516 eepro100_write_command(s
, val
);
1517 eepro100_write1(s
, SCBIntmask
, val
>> 8);
1520 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1523 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1524 eepro100_write_port(s
);
1527 TRACE(OTHER
, logout("addr=%s val=0x%04x\n", regname(addr
), val
));
1528 eepro100_write_eeprom(s
->eeprom
, val
);
1531 logout("addr=%s val=0x%04x\n", regname(addr
), val
);
1532 missing("unknown word write");
1536 static void eepro100_write4(EEPRO100State
* s
, uint32_t addr
, uint32_t val
)
1538 if (addr
<= sizeof(s
->mem
) - sizeof(val
)) {
1539 e100_write_reg4(s
, addr
, val
);
1544 eepro100_write_pointer(s
, val
);
1547 TRACE(OTHER
, logout("addr=%s val=0x%08x\n", regname(addr
), val
));
1548 eepro100_write_port(s
);
1551 eepro100_write_mdi(s
, val
);
1554 logout("addr=%s val=0x%08x\n", regname(addr
), val
);
1555 missing("unknown longword write");
1559 /*****************************************************************************
1563 ****************************************************************************/
1565 static uint32_t ioport_read1(void *opaque
, uint32_t addr
)
1567 EEPRO100State
*s
= opaque
;
1569 logout("addr=%s\n", regname(addr
));
1571 return eepro100_read1(s
, addr
- s
->region1
);
1574 static uint32_t ioport_read2(void *opaque
, uint32_t addr
)
1576 EEPRO100State
*s
= opaque
;
1577 return eepro100_read2(s
, addr
- s
->region1
);
1580 static uint32_t ioport_read4(void *opaque
, uint32_t addr
)
1582 EEPRO100State
*s
= opaque
;
1583 return eepro100_read4(s
, addr
- s
->region1
);
1586 static void ioport_write1(void *opaque
, uint32_t addr
, uint32_t val
)
1588 EEPRO100State
*s
= opaque
;
1590 logout("addr=%s val=0x%02x\n", regname(addr
), val
);
1592 eepro100_write1(s
, addr
- s
->region1
, val
);
1595 static void ioport_write2(void *opaque
, uint32_t addr
, uint32_t val
)
1597 EEPRO100State
*s
= opaque
;
1598 eepro100_write2(s
, addr
- s
->region1
, val
);
1601 static void ioport_write4(void *opaque
, uint32_t addr
, uint32_t val
)
1603 EEPRO100State
*s
= opaque
;
1604 eepro100_write4(s
, addr
- s
->region1
, val
);
1607 /***********************************************************/
1608 /* PCI EEPRO100 definitions */
1610 static void pci_map(PCIDevice
* pci_dev
, int region_num
,
1611 pcibus_t addr
, pcibus_t size
, int type
)
1613 EEPRO100State
*s
= DO_UPCAST(EEPRO100State
, dev
, pci_dev
);
1615 TRACE(OTHER
, logout("region %d, addr=0x%08"FMT_PCIBUS
", "
1616 "size=0x%08"FMT_PCIBUS
", type=%d\n",
1617 region_num
, addr
, size
, type
));
1619 assert(region_num
== 1);
1620 register_ioport_write(addr
, size
, 1, ioport_write1
, s
);
1621 register_ioport_read(addr
, size
, 1, ioport_read1
, s
);
1622 register_ioport_write(addr
, size
, 2, ioport_write2
, s
);
1623 register_ioport_read(addr
, size
, 2, ioport_read2
, s
);
1624 register_ioport_write(addr
, size
, 4, ioport_write4
, s
);
1625 register_ioport_read(addr
, size
, 4, ioport_read4
, s
);
1630 /*****************************************************************************
1632 * Memory mapped I/O.
1634 ****************************************************************************/
1636 static void pci_mmio_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
1638 EEPRO100State
*s
= opaque
;
1640 logout("addr=%s val=0x%02x\n", regname(addr
), val
);
1642 eepro100_write1(s
, addr
, val
);
1645 static void pci_mmio_writew(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
1647 EEPRO100State
*s
= opaque
;
1649 logout("addr=%s val=0x%02x\n", regname(addr
), val
);
1651 eepro100_write2(s
, addr
, val
);
1654 static void pci_mmio_writel(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
1656 EEPRO100State
*s
= opaque
;
1658 logout("addr=%s val=0x%02x\n", regname(addr
), val
);
1660 eepro100_write4(s
, addr
, val
);
1663 static uint32_t pci_mmio_readb(void *opaque
, target_phys_addr_t addr
)
1665 EEPRO100State
*s
= opaque
;
1667 logout("addr=%s\n", regname(addr
));
1669 return eepro100_read1(s
, addr
);
1672 static uint32_t pci_mmio_readw(void *opaque
, target_phys_addr_t addr
)
1674 EEPRO100State
*s
= opaque
;
1676 logout("addr=%s\n", regname(addr
));
1678 return eepro100_read2(s
, addr
);
1681 static uint32_t pci_mmio_readl(void *opaque
, target_phys_addr_t addr
)
1683 EEPRO100State
*s
= opaque
;
1685 logout("addr=%s\n", regname(addr
));
1687 return eepro100_read4(s
, addr
);
1690 static CPUWriteMemoryFunc
* const pci_mmio_write
[] = {
1696 static CPUReadMemoryFunc
* const pci_mmio_read
[] = {
1702 static int nic_can_receive(VLANClientState
*nc
)
1704 EEPRO100State
*s
= DO_UPCAST(NICState
, nc
, nc
)->opaque
;
1705 TRACE(RXTX
, logout("%p\n", s
));
1706 return get_ru_state(s
) == ru_ready
;
1708 return !eepro100_buffer_full(s
);
1712 static ssize_t
nic_receive(VLANClientState
*nc
, const uint8_t * buf
, size_t size
)
1715 * - Magic packets should set bit 30 in power management driver register.
1716 * - Interesting packets should set bit 29 in power management driver register.
1718 EEPRO100State
*s
= DO_UPCAST(NICState
, nc
, nc
)->opaque
;
1719 uint16_t rfd_status
= 0xa000;
1720 #if defined(CONFIG_PAD_RECEIVED_FRAMES)
1721 uint8_t min_buf
[60];
1723 static const uint8_t broadcast_macaddr
[6] =
1724 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1726 #if defined(CONFIG_PAD_RECEIVED_FRAMES)
1727 /* Pad to minimum Ethernet frame length */
1728 if (size
< sizeof(min_buf
)) {
1729 memcpy(min_buf
, buf
, size
);
1730 memset(&min_buf
[size
], 0, sizeof(min_buf
) - size
);
1732 size
= sizeof(min_buf
);
1736 if (s
->configuration
[8] & 0x80) {
1737 /* CSMA is disabled. */
1738 logout("%p received while CSMA is disabled\n", s
);
1740 #if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1741 } else if (size
< 64 && (s
->configuration
[7] & BIT(0))) {
1742 /* Short frame and configuration byte 7/0 (discard short receive) set:
1743 * Short frame is discarded */
1744 logout("%p received short frame (%zu byte)\n", s
, size
);
1745 s
->statistics
.rx_short_frame_errors
++;
1748 } else if ((size
> MAX_ETH_FRAME_SIZE
+ 4) && !(s
->configuration
[18] & BIT(3))) {
1749 /* Long frame and configuration byte 18/3 (long receive ok) not set:
1750 * Long frames are discarded. */
1751 logout("%p received long frame (%zu byte), ignored\n", s
, size
);
1753 } else if (memcmp(buf
, s
->conf
.macaddr
.a
, 6) == 0) { /* !!! */
1754 /* Frame matches individual address. */
1755 /* TODO: check configuration byte 15/4 (ignore U/L). */
1756 TRACE(RXTX
, logout("%p received frame for me, len=%zu\n", s
, size
));
1757 } else if (memcmp(buf
, broadcast_macaddr
, 6) == 0) {
1758 /* Broadcast frame. */
1759 TRACE(RXTX
, logout("%p received broadcast, len=%zu\n", s
, size
));
1760 rfd_status
|= 0x0002;
1761 } else if (buf
[0] & 0x01) {
1762 /* Multicast frame. */
1763 TRACE(RXTX
, logout("%p received multicast, len=%zu,%s\n", s
, size
, nic_dump(buf
, size
)));
1764 if (s
->configuration
[21] & BIT(3)) {
1765 /* Multicast all bit is set, receive all multicast frames. */
1767 unsigned mcast_idx
= compute_mcast_idx(buf
);
1768 assert(mcast_idx
< 64);
1769 if (s
->mult
[mcast_idx
>> 3] & (1 << (mcast_idx
& 7))) {
1770 /* Multicast frame is allowed in hash table. */
1771 } else if (s
->configuration
[15] & BIT(0)) {
1772 /* Promiscuous: receive all. */
1773 rfd_status
|= 0x0004;
1775 TRACE(RXTX
, logout("%p multicast ignored\n", s
));
1779 /* TODO: Next not for promiscuous mode? */
1780 rfd_status
|= 0x0002;
1781 } else if (s
->configuration
[15] & BIT(0)) {
1782 /* Promiscuous: receive all. */
1783 TRACE(RXTX
, logout("%p received frame in promiscuous mode, len=%zu\n", s
, size
));
1784 rfd_status
|= 0x0004;
1785 } else if (s
->configuration
[20] & BIT(6)) {
1786 /* Multiple IA bit set. */
1787 unsigned mcast_idx
= compute_mcast_idx(buf
);
1788 assert(mcast_idx
< 64);
1789 if (s
->mult
[mcast_idx
>> 3] & (1 << (mcast_idx
& 7))) {
1790 TRACE(RXTX
, logout("%p accepted, multiple IA bit set\n", s
));
1792 TRACE(RXTX
, logout("%p frame ignored, multiple IA bit set\n", s
));
1796 TRACE(RXTX
, logout("%p received frame, ignored, len=%zu,%s\n", s
, size
,
1797 nic_dump(buf
, size
)));
1801 if (get_ru_state(s
) != ru_ready
) {
1802 /* No resources available. */
1803 logout("no resources, state=%u\n", get_ru_state(s
));
1804 /* TODO: RNR interrupt only at first failed frame? */
1805 eepro100_rnr_interrupt(s
);
1806 s
->statistics
.rx_resource_errors
++;
1808 assert(!"no resources");
1814 cpu_physical_memory_read(s
->ru_base
+ s
->ru_offset
, &rx
,
1815 sizeof(eepro100_rx_t
));
1816 uint16_t rfd_command
= le16_to_cpu(rx
.command
);
1817 uint16_t rfd_size
= le16_to_cpu(rx
.size
);
1819 if (size
> rfd_size
) {
1820 logout("Receive buffer (%" PRId16
" bytes) too small for data "
1821 "(%zu bytes); data truncated\n", rfd_size
, size
);
1824 #if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1826 rfd_status
|= 0x0080;
1829 TRACE(OTHER
, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n",
1830 rfd_command
, rx
.link
, rx
.rx_buf_addr
, rfd_size
));
1831 e100_stw_le_phys(s
->ru_base
+ s
->ru_offset
+
1832 offsetof(eepro100_rx_t
, status
), rfd_status
);
1833 e100_stw_le_phys(s
->ru_base
+ s
->ru_offset
+
1834 offsetof(eepro100_rx_t
, count
), size
);
1835 /* Early receive interrupt not supported. */
1837 eepro100_er_interrupt(s
);
1839 /* Receive CRC Transfer not supported. */
1840 if (s
->configuration
[18] & BIT(2)) {
1841 missing("Receive CRC Transfer");
1844 /* TODO: check stripping enable bit. */
1846 assert(!(s
->configuration
[17] & BIT(0)));
1848 cpu_physical_memory_write(s
->ru_base
+ s
->ru_offset
+
1849 sizeof(eepro100_rx_t
), buf
, size
);
1850 s
->statistics
.rx_good_frames
++;
1851 eepro100_fr_interrupt(s
);
1852 s
->ru_offset
= le32_to_cpu(rx
.link
);
1853 if (rfd_command
& COMMAND_EL
) {
1854 /* EL bit is set, so this was the last frame. */
1855 logout("receive: Running out of frames\n");
1856 set_ru_state(s
, ru_suspended
);
1858 if (rfd_command
& COMMAND_S
) {
1860 set_ru_state(s
, ru_suspended
);
1865 static const VMStateDescription vmstate_eepro100
= {
1867 .minimum_version_id
= 2,
1868 .minimum_version_id_old
= 2,
1869 .fields
= (VMStateField
[]) {
1870 VMSTATE_PCI_DEVICE(dev
, EEPRO100State
),
1872 VMSTATE_BUFFER(mult
, EEPRO100State
),
1873 VMSTATE_BUFFER(mem
, EEPRO100State
),
1874 /* Save all members of struct between scb_stat and mem. */
1875 VMSTATE_UINT8(scb_stat
, EEPRO100State
),
1876 VMSTATE_UINT8(int_stat
, EEPRO100State
),
1877 VMSTATE_UNUSED(3*4),
1878 VMSTATE_MACADDR(conf
.macaddr
, EEPRO100State
),
1879 VMSTATE_UNUSED(19*4),
1880 VMSTATE_UINT16_ARRAY(mdimem
, EEPRO100State
, 32),
1881 /* The eeprom should be saved and restored by its own routines. */
1882 VMSTATE_UINT32(device
, EEPRO100State
),
1883 /* TODO check device. */
1884 VMSTATE_UINT32(pointer
, EEPRO100State
),
1885 VMSTATE_UINT32(cu_base
, EEPRO100State
),
1886 VMSTATE_UINT32(cu_offset
, EEPRO100State
),
1887 VMSTATE_UINT32(ru_base
, EEPRO100State
),
1888 VMSTATE_UINT32(ru_offset
, EEPRO100State
),
1889 VMSTATE_UINT32(statsaddr
, EEPRO100State
),
1890 /* Save eepro100_stats_t statistics. */
1891 VMSTATE_UINT32(statistics
.tx_good_frames
, EEPRO100State
),
1892 VMSTATE_UINT32(statistics
.tx_max_collisions
, EEPRO100State
),
1893 VMSTATE_UINT32(statistics
.tx_late_collisions
, EEPRO100State
),
1894 VMSTATE_UINT32(statistics
.tx_underruns
, EEPRO100State
),
1895 VMSTATE_UINT32(statistics
.tx_lost_crs
, EEPRO100State
),
1896 VMSTATE_UINT32(statistics
.tx_deferred
, EEPRO100State
),
1897 VMSTATE_UINT32(statistics
.tx_single_collisions
, EEPRO100State
),
1898 VMSTATE_UINT32(statistics
.tx_multiple_collisions
, EEPRO100State
),
1899 VMSTATE_UINT32(statistics
.tx_total_collisions
, EEPRO100State
),
1900 VMSTATE_UINT32(statistics
.rx_good_frames
, EEPRO100State
),
1901 VMSTATE_UINT32(statistics
.rx_crc_errors
, EEPRO100State
),
1902 VMSTATE_UINT32(statistics
.rx_alignment_errors
, EEPRO100State
),
1903 VMSTATE_UINT32(statistics
.rx_resource_errors
, EEPRO100State
),
1904 VMSTATE_UINT32(statistics
.rx_overrun_errors
, EEPRO100State
),
1905 VMSTATE_UINT32(statistics
.rx_cdt_errors
, EEPRO100State
),
1906 VMSTATE_UINT32(statistics
.rx_short_frame_errors
, EEPRO100State
),
1907 VMSTATE_UINT32(statistics
.fc_xmt_pause
, EEPRO100State
),
1908 VMSTATE_UINT32(statistics
.fc_rcv_pause
, EEPRO100State
),
1909 VMSTATE_UINT32(statistics
.fc_rcv_unsupported
, EEPRO100State
),
1910 VMSTATE_UINT16(statistics
.xmt_tco_frames
, EEPRO100State
),
1911 VMSTATE_UINT16(statistics
.rcv_tco_frames
, EEPRO100State
),
1912 /* Configuration bytes. */
1913 VMSTATE_BUFFER(configuration
, EEPRO100State
),
1914 VMSTATE_END_OF_LIST()
1918 static void nic_cleanup(VLANClientState
*nc
)
1920 EEPRO100State
*s
= DO_UPCAST(NICState
, nc
, nc
)->opaque
;
1925 static int pci_nic_uninit(PCIDevice
*pci_dev
)
1927 EEPRO100State
*s
= DO_UPCAST(EEPRO100State
, dev
, pci_dev
);
1929 cpu_unregister_io_memory(s
->mmio_index
);
1930 vmstate_unregister(&pci_dev
->qdev
, s
->vmstate
, s
);
1931 eeprom93xx_free(&pci_dev
->qdev
, s
->eeprom
);
1932 qemu_del_vlan_client(&s
->nic
->nc
);
1936 static NetClientInfo net_eepro100_info
= {
1937 .type
= NET_CLIENT_TYPE_NIC
,
1938 .size
= sizeof(NICState
),
1939 .can_receive
= nic_can_receive
,
1940 .receive
= nic_receive
,
1941 .cleanup
= nic_cleanup
,
1944 static int e100_nic_init(PCIDevice
*pci_dev
)
1946 EEPRO100State
*s
= DO_UPCAST(EEPRO100State
, dev
, pci_dev
);
1947 E100PCIDeviceInfo
*e100_device
= DO_UPCAST(E100PCIDeviceInfo
, pci
.qdev
,
1948 pci_dev
->qdev
.info
);
1950 TRACE(OTHER
, logout("\n"));
1952 s
->device
= e100_device
->device
;
1954 e100_pci_reset(s
, e100_device
);
1956 /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
1957 * i82559 and later support 64 or 256 word EEPROM. */
1958 s
->eeprom
= eeprom93xx_new(&pci_dev
->qdev
, EEPROM_SIZE
);
1960 /* Handler for memory-mapped I/O */
1962 cpu_register_io_memory(pci_mmio_read
, pci_mmio_write
, s
,
1963 DEVICE_LITTLE_ENDIAN
);
1965 pci_register_bar_simple(&s
->dev
, 0, PCI_MEM_SIZE
,
1966 PCI_BASE_ADDRESS_MEM_PREFETCH
, s
->mmio_index
);
1968 pci_register_bar(&s
->dev
, 1, PCI_IO_SIZE
, PCI_BASE_ADDRESS_SPACE_IO
,
1970 pci_register_bar_simple(&s
->dev
, 2, PCI_FLASH_SIZE
, 0, s
->mmio_index
);
1972 qemu_macaddr_default_if_unset(&s
->conf
.macaddr
);
1973 logout("macaddr: %s\n", nic_dump(&s
->conf
.macaddr
.a
[0], 6));
1974 assert(s
->region1
== 0);
1978 s
->nic
= qemu_new_nic(&net_eepro100_info
, &s
->conf
,
1979 pci_dev
->qdev
.info
->name
, pci_dev
->qdev
.id
, s
);
1981 qemu_format_nic_info_str(&s
->nic
->nc
, s
->conf
.macaddr
.a
);
1982 TRACE(OTHER
, logout("%s\n", s
->nic
->nc
.info_str
));
1984 qemu_register_reset(nic_reset
, s
);
1986 s
->vmstate
= qemu_malloc(sizeof(vmstate_eepro100
));
1987 memcpy(s
->vmstate
, &vmstate_eepro100
, sizeof(vmstate_eepro100
));
1988 s
->vmstate
->name
= s
->nic
->nc
.model
;
1989 vmstate_register(&pci_dev
->qdev
, -1, s
->vmstate
, s
);
1991 add_boot_device_path(s
->conf
.bootindex
, &pci_dev
->qdev
, "/ethernet-phy@0");
1996 static E100PCIDeviceInfo e100_devices
[] = {
1998 .pci
.qdev
.name
= "i82550",
1999 .pci
.qdev
.desc
= "Intel i82550 Ethernet",
2001 /* TODO: check device id. */
2002 .device_id
= PCI_DEVICE_ID_INTEL_82551IT
,
2003 /* Revision ID: 0x0c, 0x0d, 0x0e. */
2005 /* TODO: check size of statistical counters. */
2007 /* TODO: check extended tcb support. */
2008 .has_extended_tcb_support
= true,
2009 .power_management
= true,
2011 .pci
.qdev
.name
= "i82551",
2012 .pci
.qdev
.desc
= "Intel i82551 Ethernet",
2014 .device_id
= PCI_DEVICE_ID_INTEL_82551IT
,
2015 /* Revision ID: 0x0f, 0x10. */
2017 /* TODO: check size of statistical counters. */
2019 .has_extended_tcb_support
= true,
2020 .power_management
= true,
2022 .pci
.qdev
.name
= "i82557a",
2023 .pci
.qdev
.desc
= "Intel i82557A Ethernet",
2025 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2027 .power_management
= false,
2029 .pci
.qdev
.name
= "i82557b",
2030 .pci
.qdev
.desc
= "Intel i82557B Ethernet",
2032 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2034 .power_management
= false,
2036 .pci
.qdev
.name
= "i82557c",
2037 .pci
.qdev
.desc
= "Intel i82557C Ethernet",
2039 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2041 .power_management
= false,
2043 .pci
.qdev
.name
= "i82558a",
2044 .pci
.qdev
.desc
= "Intel i82558A Ethernet",
2046 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2049 .has_extended_tcb_support
= true,
2050 .power_management
= true,
2052 .pci
.qdev
.name
= "i82558b",
2053 .pci
.qdev
.desc
= "Intel i82558B Ethernet",
2055 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2058 .has_extended_tcb_support
= true,
2059 .power_management
= true,
2061 .pci
.qdev
.name
= "i82559a",
2062 .pci
.qdev
.desc
= "Intel i82559A Ethernet",
2064 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2067 .has_extended_tcb_support
= true,
2068 .power_management
= true,
2070 .pci
.qdev
.name
= "i82559b",
2071 .pci
.qdev
.desc
= "Intel i82559B Ethernet",
2073 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2076 .has_extended_tcb_support
= true,
2077 .power_management
= true,
2079 .pci
.qdev
.name
= "i82559c",
2080 .pci
.qdev
.desc
= "Intel i82559C Ethernet",
2082 .device_id
= PCI_DEVICE_ID_INTEL_82557
,
2086 /* TODO: Windows wants revision id 0x0c. */
2089 .has_extended_tcb_support
= true,
2090 .power_management
= true,
2092 .pci
.qdev
.name
= "i82559er",
2093 .pci
.qdev
.desc
= "Intel i82559ER Ethernet",
2095 .device_id
= PCI_DEVICE_ID_INTEL_82551IT
,
2098 .has_extended_tcb_support
= true,
2099 .power_management
= true,
2101 .pci
.qdev
.name
= "i82562",
2102 .pci
.qdev
.desc
= "Intel i82562 Ethernet",
2104 /* TODO: check device id. */
2105 .device_id
= PCI_DEVICE_ID_INTEL_82551IT
,
2106 /* TODO: wrong revision id. */
2109 .has_extended_tcb_support
= true,
2110 .power_management
= true,
2112 /* Toshiba Tecra 8200. */
2113 .pci
.qdev
.name
= "i82801",
2114 .pci
.qdev
.desc
= "Intel i82801 Ethernet",
2116 .device_id
= 0x2449,
2119 .has_extended_tcb_support
= true,
2120 .power_management
= true,
2124 static Property e100_properties
[] = {
2125 DEFINE_NIC_PROPERTIES(EEPRO100State
, conf
),
2126 DEFINE_PROP_END_OF_LIST(),
2129 static void eepro100_register_devices(void)
2132 for (i
= 0; i
< ARRAY_SIZE(e100_devices
); i
++) {
2133 PCIDeviceInfo
*pci_dev
= &e100_devices
[i
].pci
;
2134 /* We use the same rom file for all device ids.
2135 QEMU fixes the device id during rom load. */
2136 pci_dev
->romfile
= "gpxe-eepro100-80861209.rom";
2137 pci_dev
->init
= e100_nic_init
;
2138 pci_dev
->exit
= pci_nic_uninit
;
2139 pci_dev
->qdev
.props
= e100_properties
;
2140 pci_dev
->qdev
.size
= sizeof(EEPRO100State
);
2141 pci_qdev_register(pci_dev
);
2145 device_init(eepro100_register_devices
)