]> Git Repo - qemu.git/blame_incremental - hw/eepro100.c
eepro100: Fix endianness issues
[qemu.git] / hw / eepro100.c
... / ...
CommitLineData
1/*
2 * QEMU i8255x (PRO100) emulation
3 *
4 * Copyright (C) 2006-2011 Stefan Weil
5 *
6 * Portions of the code are copies from grub / etherboot eepro100.c
7 * and linux e100.c.
8 *
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.
13 *
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.
18 *
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/>.
21 *
22 * Tested features (i82559):
23 * PXE boot (i386 guest, i386 / mips / mipsel / ppc host) ok
24 * Linux networking (i386) ok
25 *
26 * Untested:
27 * Windows networking
28 *
29 * References:
30 *
31 * Intel 8255x 10/100 Mbps Ethernet Controller Family
32 * Open Source Software Developer Manual
33 *
34 * TODO:
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.
41 */
42
43#include <stddef.h> /* offsetof */
44#include "hw.h"
45#include "pci.h"
46#include "net.h"
47#include "eeprom93xx.h"
48#include "sysemu.h"
49
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
58
59#define KiB 1024
60
61/* Debug EEPRO100 card. */
62#if 0
63# define DEBUG_EEPRO100
64#endif
65
66#ifdef DEBUG_EEPRO100
67#define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
68#else
69#define logout(fmt, ...) ((void)0)
70#endif
71
72/* Set flags to 0 to disable debug output. */
73#define INT 1 /* interrupt related actions */
74#define MDI 1 /* mdi related actions */
75#define OTHER 1
76#define RXTX 1
77#define EEPROM 1 /* eeprom related actions */
78
79#define TRACE(flag, command) ((flag) ? (command) : (void)0)
80
81#define missing(text) fprintf(stderr, "eepro100: feature is missing in this emulation: " text "\n")
82
83#define MAX_ETH_FRAME_SIZE 1514
84
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
99
100/* Use 64 word EEPROM. TODO: could be a runtime option. */
101#define EEPROM_SIZE 64
102
103#define PCI_MEM_SIZE (4 * KiB)
104#define PCI_IO_SIZE 64
105#define PCI_FLASH_SIZE (128 * KiB)
106
107#define BIT(n) (1 << (n))
108#define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
109
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. */
119
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. */
128
129typedef struct {
130 PCIDeviceInfo pci;
131 uint32_t device;
132 uint16_t device_id;
133 uint8_t revision;
134 uint8_t stats_size;
135 bool has_extended_tcb_support;
136 bool power_management;
137} E100PCIDeviceInfo;
138
139/* Offsets to the various registers.
140 All accesses need not be longword aligned. */
141typedef enum {
142 SCBStatus = 0, /* Status Word. */
143 SCBAck = 1,
144 SCBCmd = 2, /* Rx/Command Unit command and status. */
145 SCBIntmask = 3,
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;
157
158/* A speedo3 transmit buffer descriptor with two buffers... */
159typedef struct {
160 uint16_t status;
161 uint16_t command;
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 */
167#if 0
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. */
173#endif
174} eepro100_tx_t;
175
176/* Receive frame descriptor. */
177typedef struct {
178 int16_t status;
179 uint16_t command;
180 uint32_t link; /* struct RxFD * */
181 uint32_t rx_buf_addr; /* void * */
182 uint16_t count;
183 uint16_t size;
184 /* Ethernet frame data follows. */
185} eepro100_rx_t;
186
187typedef enum {
188 COMMAND_EL = BIT(15),
189 COMMAND_S = BIT(14),
190 COMMAND_I = BIT(13),
191 COMMAND_NC = BIT(4),
192 COMMAND_SF = BIT(3),
193 COMMAND_CMD = BITS(2, 0),
194} scb_command_bit;
195
196typedef enum {
197 STATUS_C = BIT(15),
198 STATUS_OK = BIT(13),
199} scb_status_bit;
200
201typedef struct {
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];
212} eepro100_stats_t;
213
214typedef enum {
215 cu_idle = 0,
216 cu_suspended = 1,
217 cu_active = 2,
218 cu_lpq_active = 2,
219 cu_hqp_active = 3
220} cu_state_t;
221
222typedef enum {
223 ru_idle = 0,
224 ru_suspended = 1,
225 ru_no_resources = 2,
226 ru_ready = 4
227} ru_state_t;
228
229typedef struct {
230 PCIDevice dev;
231 /* Hash register (multicast mask array, multiple individual addresses). */
232 uint8_t mult[8];
233 int mmio_index;
234 NICState *nic;
235 NICConf conf;
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 */
240 uint16_t mdimem[32];
241 eeprom_t *eeprom;
242 uint32_t device; /* device variant */
243 uint32_t pointer;
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 */
251
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 */
256
257 /* Statistical counters. Also used for wake-up packet (i82559). */
258 eepro100_stats_t statistics;
259
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)));;
263
264 /* Configuration bytes. */
265 uint8_t configuration[22];
266
267 /* vmstate for each particular nic */
268 VMStateDescription *vmstate;
269
270 /* Quasi static device properties (no need to save them). */
271 uint16_t stats_size;
272 bool has_extended_tcb_support;
273} EEPRO100State;
274
275/* Word indices in EEPROM. */
276typedef enum {
277 EEPROM_CNFG_MDIX = 0x03,
278 EEPROM_ID = 0x05,
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,
284} EEPROMOffset;
285
286/* Bit values for EEPROM ID word. */
287typedef enum {
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 */
299} eeprom_id_bit;
300
301/* Default values for MDI (PHY) registers */
302static 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,
310};
311
312/* Readonly mask for MDI (PHY) registers */
313static 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,
318};
319
320/* Read a 16 bit little endian value from physical memory. */
321static uint16_t e100_ldw_le_phys(target_phys_addr_t addr)
322{
323 /* Load 16 bit (little endian) word from emulated hardware. */
324 uint16_t val;
325 cpu_physical_memory_read(addr, &val, sizeof(val));
326 return le16_to_cpu(val);
327}
328
329/* Read a 32 bit little endian value from physical memory. */
330static uint32_t e100_ldl_le_phys(target_phys_addr_t addr)
331{
332 /* Load 32 bit (little endian) word from emulated hardware. */
333 uint32_t val;
334 cpu_physical_memory_read(addr, &val, sizeof(val));
335 return le32_to_cpu(val);
336}
337
338/* Write a 16 bit little endian value to physical memory. */
339static void e100_stw_le_phys(target_phys_addr_t addr, uint16_t val)
340{
341 val = cpu_to_le16(val);
342 cpu_physical_memory_write(addr, &val, sizeof(val));
343}
344
345/* Write a 32 bit little endian value to physical memory. */
346static void e100_stl_le_phys(target_phys_addr_t addr, uint32_t val)
347{
348 val = cpu_to_le32(val);
349 cpu_physical_memory_write(addr, &val, sizeof(val));
350}
351
352#define POLYNOMIAL 0x04c11db6
353
354/* From FreeBSD */
355/* XXX: optimize */
356static unsigned compute_mcast_idx(const uint8_t * ep)
357{
358 uint32_t crc;
359 int carry, i, j;
360 uint8_t b;
361
362 crc = 0xffffffff;
363 for (i = 0; i < 6; i++) {
364 b = *ep++;
365 for (j = 0; j < 8; j++) {
366 carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
367 crc <<= 1;
368 b >>= 1;
369 if (carry) {
370 crc = ((crc ^ POLYNOMIAL) | carry);
371 }
372 }
373 }
374 return (crc & BITS(7, 2)) >> 2;
375}
376
377/* Read a 16 bit control/status (CSR) register. */
378static uint16_t e100_read_reg2(EEPRO100State *s, E100RegisterOffset addr)
379{
380 assert(!((uintptr_t)&s->mem[addr] & 1));
381 return le16_to_cpup((uint16_t *)&s->mem[addr]);
382}
383
384/* Read a 32 bit control/status (CSR) register. */
385static uint32_t e100_read_reg4(EEPRO100State *s, E100RegisterOffset addr)
386{
387 assert(!((uintptr_t)&s->mem[addr] & 3));
388 return le32_to_cpup((uint32_t *)&s->mem[addr]);
389}
390
391/* Write a 16 bit control/status (CSR) register. */
392static void e100_write_reg2(EEPRO100State *s, E100RegisterOffset addr,
393 uint16_t val)
394{
395 assert(!((uintptr_t)&s->mem[addr] & 1));
396 cpu_to_le16w((uint16_t *)&s->mem[addr], val);
397}
398
399/* Read a 32 bit control/status (CSR) register. */
400static void e100_write_reg4(EEPRO100State *s, E100RegisterOffset addr,
401 uint32_t val)
402{
403 assert(!((uintptr_t)&s->mem[addr] & 3));
404 cpu_to_le32w((uint32_t *)&s->mem[addr], val);
405}
406
407#if defined(DEBUG_EEPRO100)
408static const char *nic_dump(const uint8_t * buf, unsigned size)
409{
410 static char dump[3 * 16 + 1];
411 char *p = &dump[0];
412 if (size > 16) {
413 size = 16;
414 }
415 while (size-- > 0) {
416 p += sprintf(p, " %02x", *buf++);
417 }
418 return dump;
419}
420#endif /* DEBUG_EEPRO100 */
421
422enum scb_stat_ack {
423 stat_ack_not_ours = 0x00,
424 stat_ack_sw_gen = 0x04,
425 stat_ack_rnr = 0x10,
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),
432};
433
434static void disable_interrupt(EEPRO100State * s)
435{
436 if (s->int_stat) {
437 TRACE(INT, logout("interrupt disabled\n"));
438 qemu_irq_lower(s->dev.irq[0]);
439 s->int_stat = 0;
440 }
441}
442
443static void enable_interrupt(EEPRO100State * s)
444{
445 if (!s->int_stat) {
446 TRACE(INT, logout("interrupt enabled\n"));
447 qemu_irq_raise(s->dev.irq[0]);
448 s->int_stat = 1;
449 }
450}
451
452static void eepro100_acknowledge(EEPRO100State * s)
453{
454 s->scb_stat &= ~s->mem[SCBAck];
455 s->mem[SCBAck] = s->scb_stat;
456 if (s->scb_stat == 0) {
457 disable_interrupt(s);
458 }
459}
460
461static void eepro100_interrupt(EEPRO100State * s, uint8_t status)
462{
463 uint8_t mask = ~s->mem[SCBIntmask];
464 s->mem[SCBAck] |= status;
465 status = s->scb_stat = s->mem[SCBAck];
466 status &= (mask | 0x0f);
467#if 0
468 status &= (~s->mem[SCBIntmask] | 0x0xf);
469#endif
470 if (status && (mask & 0x01)) {
471 /* SCB mask and SCB Bit M do not disable interrupt. */
472 enable_interrupt(s);
473 } else if (s->int_stat) {
474 disable_interrupt(s);
475 }
476}
477
478static void eepro100_cx_interrupt(EEPRO100State * s)
479{
480 /* CU completed action command. */
481 /* Transmit not ok (82557 only, not in emulation). */
482 eepro100_interrupt(s, 0x80);
483}
484
485static void eepro100_cna_interrupt(EEPRO100State * s)
486{
487 /* CU left the active state. */
488 eepro100_interrupt(s, 0x20);
489}
490
491static void eepro100_fr_interrupt(EEPRO100State * s)
492{
493 /* RU received a complete frame. */
494 eepro100_interrupt(s, 0x40);
495}
496
497static void eepro100_rnr_interrupt(EEPRO100State * s)
498{
499 /* RU is not ready. */
500 eepro100_interrupt(s, 0x10);
501}
502
503static void eepro100_mdi_interrupt(EEPRO100State * s)
504{
505 /* MDI completed read or write cycle. */
506 eepro100_interrupt(s, 0x08);
507}
508
509static void eepro100_swi_interrupt(EEPRO100State * s)
510{
511 /* Software has requested an interrupt. */
512 eepro100_interrupt(s, 0x04);
513}
514
515#if 0
516static void eepro100_fcp_interrupt(EEPRO100State * s)
517{
518 /* Flow control pause interrupt (82558 and later). */
519 eepro100_interrupt(s, 0x01);
520}
521#endif
522
523static void e100_pci_reset(EEPRO100State * s, E100PCIDeviceInfo *e100_device)
524{
525 uint32_t device = s->device;
526 uint8_t *pci_conf = s->dev.config;
527
528 TRACE(OTHER, logout("%p\n", s));
529
530 /* PCI Vendor ID */
531 pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
532 /* PCI Device ID */
533 pci_config_set_device_id(pci_conf, e100_device->device_id);
534 /* PCI Status */
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. */
543 /* Interrupt Line */
544 /* Interrupt Pin */
545 pci_set_byte(pci_conf + PCI_INTERRUPT_PIN, 1); /* interrupt pin A */
546 /* Minimum Grant */
547 pci_set_byte(pci_conf + PCI_MIN_GNT, 0x08);
548 /* Maximum Latency */
549 pci_set_byte(pci_conf + PCI_MAX_LAT, 0x18);
550
551 s->stats_size = e100_device->stats_size;
552 s->has_extended_tcb_support = e100_device->has_extended_tcb_support;
553
554 switch (device) {
555 case i82550:
556 case i82551:
557 case i82557A:
558 case i82557B:
559 case i82557C:
560 case i82558A:
561 case i82558B:
562 case i82559A:
563 case i82559B:
564 case i82559ER:
565 case i82562:
566 case i82801:
567 break;
568 case i82559C:
569#if EEPROM_SIZE > 0
570 pci_set_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID, PCI_VENDOR_ID_INTEL);
571 pci_set_word(pci_conf + PCI_SUBSYSTEM_ID, 0x0040);
572#endif
573 break;
574 default:
575 logout("Device %X is undefined!\n", device);
576 }
577
578 /* Standard TxCB. */
579 s->configuration[6] |= BIT(4);
580
581 /* Standard statistical counters. */
582 s->configuration[6] |= BIT(5);
583
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));
589 } else {
590 if (s->configuration[6] & BIT(5)) {
591 /* No extended statistical counters, i82557 compatible. */
592 s->stats_size = 64;
593 } else {
594 /* i82558 compatible. */
595 s->stats_size = 76;
596 }
597 }
598 } else {
599 if (s->configuration[6] & BIT(5)) {
600 /* No extended statistical counters. */
601 s->stats_size = 64;
602 }
603 }
604 assert(s->stats_size > 0 && s->stats_size <= sizeof(s->statistics));
605
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);
611 assert(r >= 0);
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);
618#endif
619 }
620
621#if EEPROM_SIZE > 0
622 if (device == i82557C || device == i82558B || device == i82559C) {
623 /*
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.
632 */
633 logout("Get device id and revision from EEPROM!!!\n");
634 }
635#endif /* EEPROM_SIZE > 0 */
636}
637
638static void nic_selective_reset(EEPRO100State * s)
639{
640 size_t i;
641 uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
642#if 0
643 eeprom93xx_reset(s->eeprom);
644#endif
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;
650 uint16_t sum = 0;
651 for (i = 0; i < EEPROM_SIZE - 1; i++) {
652 sum += eeprom_contents[i];
653 }
654 eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum;
655 TRACE(EEPROM, logout("checksum=0x%04x\n", eeprom_contents[EEPROM_SIZE - 1]));
656
657 memset(s->mem, 0, sizeof(s->mem));
658 e100_write_reg4(s, SCBCtrlMDI, BIT(21));
659
660 assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default));
661 memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem));
662}
663
664static void nic_reset(void *opaque)
665{
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);
671}
672
673#if defined(DEBUG_EEPRO100)
674static const char * const e100_reg[PCI_IO_SIZE / 4] = {
675 "Command/Status",
676 "General Pointer",
677 "Port",
678 "EEPROM/Flash Control",
679 "MDI Control",
680 "Receive DMA Byte Count",
681 "Flow Control",
682 "General Status/Control"
683};
684
685static char *regname(uint32_t addr)
686{
687 static char buf[32];
688 if (addr < PCI_IO_SIZE) {
689 const char *r = e100_reg[addr / 4];
690 if (r != 0) {
691 snprintf(buf, sizeof(buf), "%s+%u", r, addr % 4);
692 } else {
693 snprintf(buf, sizeof(buf), "0x%02x", addr);
694 }
695 } else {
696 snprintf(buf, sizeof(buf), "??? 0x%08x", addr);
697 }
698 return buf;
699}
700#endif /* DEBUG_EEPRO100 */
701
702/*****************************************************************************
703 *
704 * Command emulation.
705 *
706 ****************************************************************************/
707
708#if 0
709static uint16_t eepro100_read_command(EEPRO100State * s)
710{
711 uint16_t val = 0xffff;
712 TRACE(OTHER, logout("val=0x%04x\n", val));
713 return val;
714}
715#endif
716
717/* Commands that can be put in a command list entry. */
718enum commands {
719 CmdNOp = 0,
720 CmdIASetup = 1,
721 CmdConfigure = 2,
722 CmdMulticastList = 3,
723 CmdTx = 4,
724 CmdTDR = 5, /* load microcode */
725 CmdDump = 6,
726 CmdDiagnose = 7,
727
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. */
732};
733
734static cu_state_t get_cu_state(EEPRO100State * s)
735{
736 return ((s->mem[SCBStatus] & BITS(7, 6)) >> 6);
737}
738
739static void set_cu_state(EEPRO100State * s, cu_state_t state)
740{
741 s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(7, 6)) + (state << 6);
742}
743
744static ru_state_t get_ru_state(EEPRO100State * s)
745{
746 return ((s->mem[SCBStatus] & BITS(5, 2)) >> 2);
747}
748
749static void set_ru_state(EEPRO100State * s, ru_state_t state)
750{
751 s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(5, 2)) + (state << 2);
752}
753
754static void dump_statistics(EEPRO100State * s)
755{
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!!!
760 */
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);
766#if 0
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");
770#endif
771}
772
773static void read_cb(EEPRO100State *s)
774{
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);
781}
782
783static void tx_command(EEPRO100State *s)
784{
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. */
788 uint8_t buf[2600];
789 uint16_t size = 0;
790 uint32_t tbd_address = s->cb_address + 0x10;
791 TRACE(RXTX, logout
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));
794
795 if (tcb_bytes > 2600) {
796 logout("TCB byte count too large, using 2600\n");
797 tcb_bytes = 2600;
798 }
799 if (!((tcb_bytes > 0) || (tbd_array != 0xffffffff))) {
800 logout
801 ("illegal values of TBD array address and TCB byte count!\n");
802 }
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);
807#if 0
808 uint16_t tx_buffer_el = e100_ldw_le_phys(tbd_address + 6);
809#endif
810 tbd_address += 8;
811 TRACE(RXTX, logout
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],
816 tx_buffer_size);
817 size += tx_buffer_size;
818 }
819 if (tbd_array == 0xffffffff) {
820 /* Simplified mode. Was already handled by code above. */
821 } else {
822 /* Flexible mode. */
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);
830 tbd_address += 8;
831 TRACE(RXTX, logout
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],
836 tx_buffer_size);
837 size += tx_buffer_size;
838 if (tx_buffer_el & 1) {
839 break;
840 }
841 }
842 }
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);
848 tbd_address += 8;
849 TRACE(RXTX, logout
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],
854 tx_buffer_size);
855 size += tx_buffer_size;
856 if (tx_buffer_el & 1) {
857 break;
858 }
859 }
860 }
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. */
866#if 0
867 eepro100_cx_interrupt(s);
868#endif
869}
870
871static void set_multicast_list(EEPRO100State *s)
872{
873 uint16_t multicast_count = s->tx.tbd_array_addr & BITS(13, 0);
874 uint16_t i;
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));
884 }
885}
886
887static void action_command(EEPRO100State *s)
888{
889 for (;;) {
890 bool bit_el;
891 bool bit_s;
892 bool bit_i;
893 bool bit_nc;
894 uint16_t ok_status = STATUS_OK;
895 s->cb_address = s->cu_base + s->cu_offset;
896 read_cb(s);
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);
901#if 0
902 bool bit_sf = ((s->tx.command & COMMAND_SF) != 0);
903#endif
904 s->cu_offset = s->tx.link;
905 TRACE(OTHER,
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) {
909 case CmdNOp:
910 /* Do nothing. */
911 break;
912 case CmdIASetup:
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)));
915 break;
916 case CmdConfigure:
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"));
926 }
927 break;
928 case CmdMulticastList:
929 set_multicast_list(s);
930 break;
931 case CmdTx:
932 if (bit_nc) {
933 missing("CmdTx: NC = 0");
934 ok_status = 0;
935 break;
936 }
937 tx_command(s);
938 break;
939 case CmdTDR:
940 TRACE(OTHER, logout("load microcode\n"));
941 /* Starting with offset 8, the command contains
942 * 64 dwords microcode which we just ignore here. */
943 break;
944 case CmdDiagnose:
945 TRACE(OTHER, logout("diagnose\n"));
946 /* Make sure error flag is not set. */
947 s->tx.status = 0;
948 break;
949 default:
950 missing("undefined command");
951 ok_status = 0;
952 break;
953 }
954 /* Write new status. */
955 e100_stw_le_phys(s->cb_address, s->tx.status | ok_status | STATUS_C);
956 if (bit_i) {
957 /* CU completed action. */
958 eepro100_cx_interrupt(s);
959 }
960 if (bit_el) {
961 /* CU becomes idle. Terminate command loop. */
962 set_cu_state(s, cu_idle);
963 eepro100_cna_interrupt(s);
964 break;
965 } else if (bit_s) {
966 /* CU becomes suspended. Terminate command loop. */
967 set_cu_state(s, cu_suspended);
968 eepro100_cna_interrupt(s);
969 break;
970 } else {
971 /* More entries in list. */
972 TRACE(OTHER, logout("CU list with at least one more entry\n"));
973 }
974 }
975 TRACE(OTHER, logout("CU list empty\n"));
976 /* List is empty. Now CU is idle or suspended. */
977}
978
979static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
980{
981 cu_state_t cu_state;
982 switch (val) {
983 case CU_NOP:
984 /* No operation. */
985 break;
986 case CU_START:
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);
992 }
993 set_cu_state(s, cu_active);
994 s->cu_offset = s->pointer;
995 action_command(s);
996 break;
997 case CU_RESUME:
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. */
1002#if 0
1003 missing("cu resume");
1004#endif
1005 set_cu_state(s, cu_suspended);
1006 }
1007 if (get_cu_state(s) == cu_suspended) {
1008 TRACE(OTHER, logout("CU resuming\n"));
1009 set_cu_state(s, cu_active);
1010 action_command(s);
1011 }
1012 break;
1013 case CU_STATSADDR:
1014 /* Load dump counters address. */
1015 s->statsaddr = s->pointer;
1016 TRACE(OTHER, logout("val=0x%02x (status address)\n", val));
1017 break;
1018 case CU_SHOWSTATS:
1019 /* Dump statistical counters. */
1020 TRACE(OTHER, logout("val=0x%02x (dump stats)\n", val));
1021 dump_statistics(s);
1022 e100_stl_le_phys(s->statsaddr + s->stats_size, 0xa005);
1023 break;
1024 case CU_CMD_BASE:
1025 /* Load CU base. */
1026 TRACE(OTHER, logout("val=0x%02x (CU base address)\n", val));
1027 s->cu_base = s->pointer;
1028 break;
1029 case CU_DUMPSTATS:
1030 /* Dump and reset statistical counters. */
1031 TRACE(OTHER, logout("val=0x%02x (dump stats and reset)\n", val));
1032 dump_statistics(s);
1033 e100_stl_le_phys(s->statsaddr + s->stats_size, 0xa007);
1034 memset(&s->statistics, 0, sizeof(s->statistics));
1035 break;
1036 case CU_SRESUME:
1037 /* CU static resume. */
1038 missing("CU static resume");
1039 break;
1040 default:
1041 missing("Undefined CU command");
1042 }
1043}
1044
1045static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
1046{
1047 switch (val) {
1048 case RU_NOP:
1049 /* No operation. */
1050 break;
1051 case RX_START:
1052 /* RU start. */
1053 if (get_ru_state(s) != ru_idle) {
1054 logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
1055#if 0
1056 assert(!"wrong RU state");
1057#endif
1058 }
1059 set_ru_state(s, ru_ready);
1060 s->ru_offset = s->pointer;
1061 TRACE(OTHER, logout("val=0x%02x (rx start)\n", val));
1062 break;
1063 case RX_RESUME:
1064 /* Restart RU. */
1065 if (get_ru_state(s) != ru_suspended) {
1066 logout("RU state is %u, should be %u\n", get_ru_state(s),
1067 ru_suspended);
1068#if 0
1069 assert(!"wrong RU state");
1070#endif
1071 }
1072 set_ru_state(s, ru_ready);
1073 break;
1074 case RU_ABORT:
1075 /* RU abort. */
1076 if (get_ru_state(s) == ru_ready) {
1077 eepro100_rnr_interrupt(s);
1078 }
1079 set_ru_state(s, ru_idle);
1080 break;
1081 case RX_ADDR_LOAD:
1082 /* Load RU base. */
1083 TRACE(OTHER, logout("val=0x%02x (RU base address)\n", val));
1084 s->ru_base = s->pointer;
1085 break;
1086 default:
1087 logout("val=0x%02x (undefined RU command)\n", val);
1088 missing("Undefined SU command");
1089 }
1090}
1091
1092static void eepro100_write_command(EEPRO100State * s, uint8_t val)
1093{
1094 eepro100_ru_command(s, val & 0x0f);
1095 eepro100_cu_command(s, val & 0xf0);
1096 if ((val) == 0) {
1097 TRACE(OTHER, logout("val=0x%02x\n", val));
1098 }
1099 /* Clear command byte after command was accepted. */
1100 s->mem[SCBCmd] = 0;
1101}
1102
1103/*****************************************************************************
1104 *
1105 * EEPROM emulation.
1106 *
1107 ****************************************************************************/
1108
1109#define EEPROM_CS 0x02
1110#define EEPROM_SK 0x01
1111#define EEPROM_DI 0x04
1112#define EEPROM_DO 0x08
1113
1114static uint16_t eepro100_read_eeprom(EEPRO100State * s)
1115{
1116 uint16_t val = e100_read_reg2(s, SCBeeprom);
1117 if (eeprom93xx_read(s->eeprom)) {
1118 val |= EEPROM_DO;
1119 } else {
1120 val &= ~EEPROM_DO;
1121 }
1122 TRACE(EEPROM, logout("val=0x%04x\n", val));
1123 return val;
1124}
1125
1126static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
1127{
1128 TRACE(EEPROM, logout("val=0x%02x\n", val));
1129
1130 /* mask unwriteable bits */
1131#if 0
1132 val = SET_MASKED(val, 0x31, eeprom->value);
1133#endif
1134
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);
1139}
1140
1141static void eepro100_write_pointer(EEPRO100State * s, uint32_t val)
1142{
1143 s->pointer = le32_to_cpu(val);
1144 TRACE(OTHER, logout("val=0x%08x\n", val));
1145}
1146
1147/*****************************************************************************
1148 *
1149 * MDI emulation.
1150 *
1151 ****************************************************************************/
1152
1153#if defined(DEBUG_EEPRO100)
1154static const char * const mdi_op_name[] = {
1155 "opcode 0",
1156 "write",
1157 "read",
1158 "opcode 3"
1159};
1160
1161static const char * const mdi_reg_name[] = {
1162 "Control",
1163 "Status",
1164 "PHY Identification (Word 1)",
1165 "PHY Identification (Word 2)",
1166 "Auto-Negotiation Advertisement",
1167 "Auto-Negotiation Link Partner Ability",
1168 "Auto-Negotiation Expansion"
1169};
1170
1171static const char *reg2name(uint8_t reg)
1172{
1173 static char buffer[10];
1174 const char *p = buffer;
1175 if (reg < ARRAY_SIZE(mdi_reg_name)) {
1176 p = mdi_reg_name[reg];
1177 } else {
1178 snprintf(buffer, sizeof(buffer), "reg=0x%02x", reg);
1179 }
1180 return p;
1181}
1182#endif /* DEBUG_EEPRO100 */
1183
1184static uint32_t eepro100_read_mdi(EEPRO100State * s)
1185{
1186 uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
1187
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));
1194#endif
1195 /* Emulation takes no time to finish MDI transaction. */
1196 val |= BIT(28);
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));
1200 return val;
1201}
1202
1203static void eepro100_write_mdi(EEPRO100State * s, uint32_t val)
1204{
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));
1212 if (phy != 1) {
1213 /* Unsupported PHY address. */
1214#if 0
1215 logout("phy must be 1 but is %u\n", phy);
1216#endif
1217 data = 0;
1218 } else if (opcode != 1 && opcode != 2) {
1219 /* Unsupported opcode. */
1220 logout("opcode must be 1 or 2 but is %u\n", opcode);
1221 data = 0;
1222 } else if (reg > 6) {
1223 /* Unsupported register. */
1224 logout("register must be 0...6 but is %u\n", reg);
1225 data = 0;
1226 } else {
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));
1230 if (opcode == 1) {
1231 /* MDI write */
1232 switch (reg) {
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];
1239 } else {
1240 /* Restart Auto Configuration = Normal Operation */
1241 data &= ~0x0200;
1242 }
1243 break;
1244 case 1: /* Status Register */
1245 missing("not writable");
1246 data = s->mdimem[reg];
1247 break;
1248 case 2: /* PHY Identification Register (Word 1) */
1249 case 3: /* PHY Identification Register (Word 2) */
1250 missing("not implemented");
1251 break;
1252 case 4: /* Auto-Negotiation Advertisement Register */
1253 case 5: /* Auto-Negotiation Link Partner Ability Register */
1254 break;
1255 case 6: /* Auto-Negotiation Expansion Register */
1256 default:
1257 missing("not implemented");
1258 }
1259 s->mdimem[reg] = data;
1260 } else if (opcode == 2) {
1261 /* MDI read */
1262 switch (reg) {
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];
1268 }
1269 break;
1270 case 1: /* Status Register */
1271 s->mdimem[reg] |= 0x0020;
1272 break;
1273 case 2: /* PHY Identification Register (Word 1) */
1274 case 3: /* PHY Identification Register (Word 2) */
1275 case 4: /* Auto-Negotiation Advertisement Register */
1276 break;
1277 case 5: /* Auto-Negotiation Link Partner Ability Register */
1278 s->mdimem[reg] = 0x41fe;
1279 break;
1280 case 6: /* Auto-Negotiation Expansion Register */
1281 s->mdimem[reg] = 0x0001;
1282 break;
1283 }
1284 data = s->mdimem[reg];
1285 }
1286 /* Emulation takes no time to finish MDI transaction.
1287 * Set MDI bit in SCB status register. */
1288 s->mem[SCBAck] |= 0x08;
1289 val |= BIT(28);
1290 if (raiseint) {
1291 eepro100_mdi_interrupt(s);
1292 }
1293 }
1294 val = (val & 0xffff0000) + data;
1295 e100_write_reg4(s, SCBCtrlMDI, val);
1296}
1297
1298/*****************************************************************************
1299 *
1300 * Port emulation.
1301 *
1302 ****************************************************************************/
1303
1304#define PORT_SOFTWARE_RESET 0
1305#define PORT_SELFTEST 1
1306#define PORT_SELECTIVE_RESET 2
1307#define PORT_DUMP 3
1308#define PORT_SELECTION_MASK 3
1309
1310typedef struct {
1311 uint32_t st_sign; /* Self Test Signature */
1312 uint32_t st_result; /* Self Test Results */
1313} eepro100_selftest_t;
1314
1315static uint32_t eepro100_read_port(EEPRO100State * s)
1316{
1317 return 0;
1318}
1319
1320static void eepro100_write_port(EEPRO100State * s, uint32_t val)
1321{
1322 uint32_t address = (val & ~PORT_SELECTION_MASK);
1323 uint8_t selection = (val & PORT_SELECTION_MASK);
1324 switch (selection) {
1325 case PORT_SOFTWARE_RESET:
1326 nic_reset(s);
1327 break;
1328 case PORT_SELFTEST:
1329 TRACE(OTHER, logout("selftest address=0x%08x\n", address));
1330 eepro100_selftest_t data;
1331 cpu_physical_memory_read(address, &data, sizeof(data));
1332 data.st_sign = 0xffffffff;
1333 data.st_result = 0;
1334 cpu_physical_memory_write(address, &data, sizeof(data));
1335 break;
1336 case PORT_SELECTIVE_RESET:
1337 TRACE(OTHER, logout("selective reset, selftest address=0x%08x\n", address));
1338 nic_selective_reset(s);
1339 break;
1340 default:
1341 logout("val=0x%08x\n", val);
1342 missing("unknown port selection");
1343 }
1344}
1345
1346/*****************************************************************************
1347 *
1348 * General hardware emulation.
1349 *
1350 ****************************************************************************/
1351
1352static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
1353{
1354 uint8_t val = 0;
1355 if (addr <= sizeof(s->mem) - sizeof(val)) {
1356 val = s->mem[addr];
1357 }
1358
1359 switch (addr) {
1360 case SCBStatus:
1361 case SCBAck:
1362 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1363 break;
1364 case SCBCmd:
1365 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1366#if 0
1367 val = eepro100_read_command(s);
1368#endif
1369 break;
1370 case SCBIntmask:
1371 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1372 break;
1373 case SCBPort + 3:
1374 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1375 break;
1376 case SCBeeprom:
1377 val = eepro100_read_eeprom(s);
1378 break;
1379 case SCBpmdr: /* Power Management Driver Register */
1380 val = 0;
1381 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1382 break;
1383 case SCBgstat: /* General Status Register */
1384 /* 100 Mbps full duplex, valid link */
1385 val = 0x07;
1386 TRACE(OTHER, logout("addr=General Status val=%02x\n", val));
1387 break;
1388 default:
1389 logout("addr=%s val=0x%02x\n", regname(addr), val);
1390 missing("unknown byte read");
1391 }
1392 return val;
1393}
1394
1395static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
1396{
1397 uint16_t val = 0;
1398 if (addr <= sizeof(s->mem) - sizeof(val)) {
1399 val = e100_read_reg2(s, addr);
1400 }
1401
1402 switch (addr) {
1403 case SCBStatus:
1404 case SCBCmd:
1405 TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1406 break;
1407 case SCBeeprom:
1408 val = eepro100_read_eeprom(s);
1409 TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1410 break;
1411 default:
1412 logout("addr=%s val=0x%04x\n", regname(addr), val);
1413 missing("unknown word read");
1414 }
1415 return val;
1416}
1417
1418static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
1419{
1420 uint32_t val = 0;
1421 if (addr <= sizeof(s->mem) - sizeof(val)) {
1422 val = e100_read_reg4(s, addr);
1423 }
1424
1425 switch (addr) {
1426 case SCBStatus:
1427 TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1428 break;
1429 case SCBPointer:
1430#if 0
1431 val = eepro100_read_pointer(s);
1432#endif
1433 TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1434 break;
1435 case SCBPort:
1436 val = eepro100_read_port(s);
1437 TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1438 break;
1439 case SCBCtrlMDI:
1440 val = eepro100_read_mdi(s);
1441 break;
1442 default:
1443 logout("addr=%s val=0x%08x\n", regname(addr), val);
1444 missing("unknown longword read");
1445 }
1446 return val;
1447}
1448
1449static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
1450{
1451 /* SCBStatus is readonly. */
1452 if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
1453 s->mem[addr] = val;
1454 }
1455
1456 switch (addr) {
1457 case SCBStatus:
1458 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1459 break;
1460 case SCBAck:
1461 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1462 eepro100_acknowledge(s);
1463 break;
1464 case SCBCmd:
1465 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1466 eepro100_write_command(s, val);
1467 break;
1468 case SCBIntmask:
1469 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1470 if (val & BIT(1)) {
1471 eepro100_swi_interrupt(s);
1472 }
1473 eepro100_interrupt(s, 0);
1474 break;
1475 case SCBPort + 3:
1476 case SCBFlow: /* does not exist on 82557 */
1477 case SCBFlow + 1:
1478 case SCBFlow + 2:
1479 case SCBpmdr: /* does not exist on 82557 */
1480 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1481 break;
1482 case SCBeeprom:
1483 TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1484 eepro100_write_eeprom(s->eeprom, val);
1485 break;
1486 default:
1487 logout("addr=%s val=0x%02x\n", regname(addr), val);
1488 missing("unknown byte write");
1489 }
1490}
1491
1492static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
1493{
1494 /* SCBStatus is readonly. */
1495 if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
1496 e100_write_reg2(s, addr, val);
1497 }
1498
1499 switch (addr) {
1500 case SCBStatus:
1501 TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1502 s->mem[SCBAck] = (val >> 8);
1503 eepro100_acknowledge(s);
1504 break;
1505 case SCBCmd:
1506 TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1507 eepro100_write_command(s, val);
1508 eepro100_write1(s, SCBIntmask, val >> 8);
1509 break;
1510 case SCBeeprom:
1511 TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1512 eepro100_write_eeprom(s->eeprom, val);
1513 break;
1514 default:
1515 logout("addr=%s val=0x%04x\n", regname(addr), val);
1516 missing("unknown word write");
1517 }
1518}
1519
1520static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
1521{
1522 if (addr <= sizeof(s->mem) - sizeof(val)) {
1523 e100_write_reg4(s, addr, val);
1524 }
1525
1526 switch (addr) {
1527 case SCBPointer:
1528 eepro100_write_pointer(s, val);
1529 break;
1530 case SCBPort:
1531 TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1532 eepro100_write_port(s, val);
1533 break;
1534 case SCBCtrlMDI:
1535 eepro100_write_mdi(s, val);
1536 break;
1537 default:
1538 logout("addr=%s val=0x%08x\n", regname(addr), val);
1539 missing("unknown longword write");
1540 }
1541}
1542
1543/*****************************************************************************
1544 *
1545 * Port mapped I/O.
1546 *
1547 ****************************************************************************/
1548
1549static uint32_t ioport_read1(void *opaque, uint32_t addr)
1550{
1551 EEPRO100State *s = opaque;
1552#if 0
1553 logout("addr=%s\n", regname(addr));
1554#endif
1555 return eepro100_read1(s, addr - s->region1);
1556}
1557
1558static uint32_t ioport_read2(void *opaque, uint32_t addr)
1559{
1560 EEPRO100State *s = opaque;
1561 return eepro100_read2(s, addr - s->region1);
1562}
1563
1564static uint32_t ioport_read4(void *opaque, uint32_t addr)
1565{
1566 EEPRO100State *s = opaque;
1567 return eepro100_read4(s, addr - s->region1);
1568}
1569
1570static void ioport_write1(void *opaque, uint32_t addr, uint32_t val)
1571{
1572 EEPRO100State *s = opaque;
1573#if 0
1574 logout("addr=%s val=0x%02x\n", regname(addr), val);
1575#endif
1576 eepro100_write1(s, addr - s->region1, val);
1577}
1578
1579static void ioport_write2(void *opaque, uint32_t addr, uint32_t val)
1580{
1581 EEPRO100State *s = opaque;
1582 eepro100_write2(s, addr - s->region1, val);
1583}
1584
1585static void ioport_write4(void *opaque, uint32_t addr, uint32_t val)
1586{
1587 EEPRO100State *s = opaque;
1588 eepro100_write4(s, addr - s->region1, val);
1589}
1590
1591/***********************************************************/
1592/* PCI EEPRO100 definitions */
1593
1594static void pci_map(PCIDevice * pci_dev, int region_num,
1595 pcibus_t addr, pcibus_t size, int type)
1596{
1597 EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1598
1599 TRACE(OTHER, logout("region %d, addr=0x%08"FMT_PCIBUS", "
1600 "size=0x%08"FMT_PCIBUS", type=%d\n",
1601 region_num, addr, size, type));
1602
1603 assert(region_num == 1);
1604 register_ioport_write(addr, size, 1, ioport_write1, s);
1605 register_ioport_read(addr, size, 1, ioport_read1, s);
1606 register_ioport_write(addr, size, 2, ioport_write2, s);
1607 register_ioport_read(addr, size, 2, ioport_read2, s);
1608 register_ioport_write(addr, size, 4, ioport_write4, s);
1609 register_ioport_read(addr, size, 4, ioport_read4, s);
1610
1611 s->region1 = addr;
1612}
1613
1614/*****************************************************************************
1615 *
1616 * Memory mapped I/O.
1617 *
1618 ****************************************************************************/
1619
1620static void pci_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1621{
1622 EEPRO100State *s = opaque;
1623#if 0
1624 logout("addr=%s val=0x%02x\n", regname(addr), val);
1625#endif
1626 eepro100_write1(s, addr, val);
1627}
1628
1629static void pci_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1630{
1631 EEPRO100State *s = opaque;
1632#if 0
1633 logout("addr=%s val=0x%02x\n", regname(addr), val);
1634#endif
1635 eepro100_write2(s, addr, val);
1636}
1637
1638static void pci_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
1639{
1640 EEPRO100State *s = opaque;
1641#if 0
1642 logout("addr=%s val=0x%02x\n", regname(addr), val);
1643#endif
1644 eepro100_write4(s, addr, val);
1645}
1646
1647static uint32_t pci_mmio_readb(void *opaque, target_phys_addr_t addr)
1648{
1649 EEPRO100State *s = opaque;
1650#if 0
1651 logout("addr=%s\n", regname(addr));
1652#endif
1653 return eepro100_read1(s, addr);
1654}
1655
1656static uint32_t pci_mmio_readw(void *opaque, target_phys_addr_t addr)
1657{
1658 EEPRO100State *s = opaque;
1659#if 0
1660 logout("addr=%s\n", regname(addr));
1661#endif
1662 return eepro100_read2(s, addr);
1663}
1664
1665static uint32_t pci_mmio_readl(void *opaque, target_phys_addr_t addr)
1666{
1667 EEPRO100State *s = opaque;
1668#if 0
1669 logout("addr=%s\n", regname(addr));
1670#endif
1671 return eepro100_read4(s, addr);
1672}
1673
1674static CPUWriteMemoryFunc * const pci_mmio_write[] = {
1675 pci_mmio_writeb,
1676 pci_mmio_writew,
1677 pci_mmio_writel
1678};
1679
1680static CPUReadMemoryFunc * const pci_mmio_read[] = {
1681 pci_mmio_readb,
1682 pci_mmio_readw,
1683 pci_mmio_readl
1684};
1685
1686static int nic_can_receive(VLANClientState *nc)
1687{
1688 EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
1689 TRACE(RXTX, logout("%p\n", s));
1690 return get_ru_state(s) == ru_ready;
1691#if 0
1692 return !eepro100_buffer_full(s);
1693#endif
1694}
1695
1696static ssize_t nic_receive(VLANClientState *nc, const uint8_t * buf, size_t size)
1697{
1698 /* TODO:
1699 * - Magic packets should set bit 30 in power management driver register.
1700 * - Interesting packets should set bit 29 in power management driver register.
1701 */
1702 EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
1703 uint16_t rfd_status = 0xa000;
1704#if defined(CONFIG_PAD_RECEIVED_FRAMES)
1705 uint8_t min_buf[60];
1706#endif
1707 static const uint8_t broadcast_macaddr[6] =
1708 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1709
1710#if defined(CONFIG_PAD_RECEIVED_FRAMES)
1711 /* Pad to minimum Ethernet frame length */
1712 if (size < sizeof(min_buf)) {
1713 memcpy(min_buf, buf, size);
1714 memset(&min_buf[size], 0, sizeof(min_buf) - size);
1715 buf = min_buf;
1716 size = sizeof(min_buf);
1717 }
1718#endif
1719
1720 if (s->configuration[8] & 0x80) {
1721 /* CSMA is disabled. */
1722 logout("%p received while CSMA is disabled\n", s);
1723 return -1;
1724#if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1725 } else if (size < 64 && (s->configuration[7] & BIT(0))) {
1726 /* Short frame and configuration byte 7/0 (discard short receive) set:
1727 * Short frame is discarded */
1728 logout("%p received short frame (%zu byte)\n", s, size);
1729 s->statistics.rx_short_frame_errors++;
1730 return -1;
1731#endif
1732 } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & BIT(3))) {
1733 /* Long frame and configuration byte 18/3 (long receive ok) not set:
1734 * Long frames are discarded. */
1735 logout("%p received long frame (%zu byte), ignored\n", s, size);
1736 return -1;
1737 } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) { /* !!! */
1738 /* Frame matches individual address. */
1739 /* TODO: check configuration byte 15/4 (ignore U/L). */
1740 TRACE(RXTX, logout("%p received frame for me, len=%zu\n", s, size));
1741 } else if (memcmp(buf, broadcast_macaddr, 6) == 0) {
1742 /* Broadcast frame. */
1743 TRACE(RXTX, logout("%p received broadcast, len=%zu\n", s, size));
1744 rfd_status |= 0x0002;
1745 } else if (buf[0] & 0x01) {
1746 /* Multicast frame. */
1747 TRACE(RXTX, logout("%p received multicast, len=%zu,%s\n", s, size, nic_dump(buf, size)));
1748 if (s->configuration[21] & BIT(3)) {
1749 /* Multicast all bit is set, receive all multicast frames. */
1750 } else {
1751 unsigned mcast_idx = compute_mcast_idx(buf);
1752 assert(mcast_idx < 64);
1753 if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
1754 /* Multicast frame is allowed in hash table. */
1755 } else if (s->configuration[15] & BIT(0)) {
1756 /* Promiscuous: receive all. */
1757 rfd_status |= 0x0004;
1758 } else {
1759 TRACE(RXTX, logout("%p multicast ignored\n", s));
1760 return -1;
1761 }
1762 }
1763 /* TODO: Next not for promiscuous mode? */
1764 rfd_status |= 0x0002;
1765 } else if (s->configuration[15] & BIT(0)) {
1766 /* Promiscuous: receive all. */
1767 TRACE(RXTX, logout("%p received frame in promiscuous mode, len=%zu\n", s, size));
1768 rfd_status |= 0x0004;
1769 } else if (s->configuration[20] & BIT(6)) {
1770 /* Multiple IA bit set. */
1771 unsigned mcast_idx = compute_mcast_idx(buf);
1772 assert(mcast_idx < 64);
1773 if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
1774 TRACE(RXTX, logout("%p accepted, multiple IA bit set\n", s));
1775 } else {
1776 TRACE(RXTX, logout("%p frame ignored, multiple IA bit set\n", s));
1777 return -1;
1778 }
1779 } else {
1780 TRACE(RXTX, logout("%p received frame, ignored, len=%zu,%s\n", s, size,
1781 nic_dump(buf, size)));
1782 return size;
1783 }
1784
1785 if (get_ru_state(s) != ru_ready) {
1786 /* No resources available. */
1787 logout("no resources, state=%u\n", get_ru_state(s));
1788 /* TODO: RNR interrupt only at first failed frame? */
1789 eepro100_rnr_interrupt(s);
1790 s->statistics.rx_resource_errors++;
1791#if 0
1792 assert(!"no resources");
1793#endif
1794 return -1;
1795 }
1796 /* !!! */
1797 eepro100_rx_t rx;
1798 cpu_physical_memory_read(s->ru_base + s->ru_offset, &rx,
1799 sizeof(eepro100_rx_t));
1800 uint16_t rfd_command = le16_to_cpu(rx.command);
1801 uint16_t rfd_size = le16_to_cpu(rx.size);
1802
1803 if (size > rfd_size) {
1804 logout("Receive buffer (%" PRId16 " bytes) too small for data "
1805 "(%zu bytes); data truncated\n", rfd_size, size);
1806 size = rfd_size;
1807 }
1808#if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1809 if (size < 64) {
1810 rfd_status |= 0x0080;
1811 }
1812#endif
1813 TRACE(OTHER, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n",
1814 rfd_command, rx.link, rx.rx_buf_addr, rfd_size));
1815 e100_stw_le_phys(s->ru_base + s->ru_offset +
1816 offsetof(eepro100_rx_t, status), rfd_status);
1817 e100_stw_le_phys(s->ru_base + s->ru_offset +
1818 offsetof(eepro100_rx_t, count), size);
1819 /* Early receive interrupt not supported. */
1820#if 0
1821 eepro100_er_interrupt(s);
1822#endif
1823 /* Receive CRC Transfer not supported. */
1824 if (s->configuration[18] & BIT(2)) {
1825 missing("Receive CRC Transfer");
1826 return -1;
1827 }
1828 /* TODO: check stripping enable bit. */
1829#if 0
1830 assert(!(s->configuration[17] & BIT(0)));
1831#endif
1832 cpu_physical_memory_write(s->ru_base + s->ru_offset +
1833 sizeof(eepro100_rx_t), buf, size);
1834 s->statistics.rx_good_frames++;
1835 eepro100_fr_interrupt(s);
1836 s->ru_offset = le32_to_cpu(rx.link);
1837 if (rfd_command & COMMAND_EL) {
1838 /* EL bit is set, so this was the last frame. */
1839 logout("receive: Running out of frames\n");
1840 set_ru_state(s, ru_suspended);
1841 }
1842 if (rfd_command & COMMAND_S) {
1843 /* S bit is set. */
1844 set_ru_state(s, ru_suspended);
1845 }
1846 return size;
1847}
1848
1849static const VMStateDescription vmstate_eepro100 = {
1850 .version_id = 3,
1851 .minimum_version_id = 2,
1852 .minimum_version_id_old = 2,
1853 .fields = (VMStateField []) {
1854 VMSTATE_PCI_DEVICE(dev, EEPRO100State),
1855 VMSTATE_UNUSED(32),
1856 VMSTATE_BUFFER(mult, EEPRO100State),
1857 VMSTATE_BUFFER(mem, EEPRO100State),
1858 /* Save all members of struct between scb_stat and mem. */
1859 VMSTATE_UINT8(scb_stat, EEPRO100State),
1860 VMSTATE_UINT8(int_stat, EEPRO100State),
1861 VMSTATE_UNUSED(3*4),
1862 VMSTATE_MACADDR(conf.macaddr, EEPRO100State),
1863 VMSTATE_UNUSED(19*4),
1864 VMSTATE_UINT16_ARRAY(mdimem, EEPRO100State, 32),
1865 /* The eeprom should be saved and restored by its own routines. */
1866 VMSTATE_UINT32(device, EEPRO100State),
1867 /* TODO check device. */
1868 VMSTATE_UINT32(pointer, EEPRO100State),
1869 VMSTATE_UINT32(cu_base, EEPRO100State),
1870 VMSTATE_UINT32(cu_offset, EEPRO100State),
1871 VMSTATE_UINT32(ru_base, EEPRO100State),
1872 VMSTATE_UINT32(ru_offset, EEPRO100State),
1873 VMSTATE_UINT32(statsaddr, EEPRO100State),
1874 /* Save eepro100_stats_t statistics. */
1875 VMSTATE_UINT32(statistics.tx_good_frames, EEPRO100State),
1876 VMSTATE_UINT32(statistics.tx_max_collisions, EEPRO100State),
1877 VMSTATE_UINT32(statistics.tx_late_collisions, EEPRO100State),
1878 VMSTATE_UINT32(statistics.tx_underruns, EEPRO100State),
1879 VMSTATE_UINT32(statistics.tx_lost_crs, EEPRO100State),
1880 VMSTATE_UINT32(statistics.tx_deferred, EEPRO100State),
1881 VMSTATE_UINT32(statistics.tx_single_collisions, EEPRO100State),
1882 VMSTATE_UINT32(statistics.tx_multiple_collisions, EEPRO100State),
1883 VMSTATE_UINT32(statistics.tx_total_collisions, EEPRO100State),
1884 VMSTATE_UINT32(statistics.rx_good_frames, EEPRO100State),
1885 VMSTATE_UINT32(statistics.rx_crc_errors, EEPRO100State),
1886 VMSTATE_UINT32(statistics.rx_alignment_errors, EEPRO100State),
1887 VMSTATE_UINT32(statistics.rx_resource_errors, EEPRO100State),
1888 VMSTATE_UINT32(statistics.rx_overrun_errors, EEPRO100State),
1889 VMSTATE_UINT32(statistics.rx_cdt_errors, EEPRO100State),
1890 VMSTATE_UINT32(statistics.rx_short_frame_errors, EEPRO100State),
1891 VMSTATE_UINT32(statistics.fc_xmt_pause, EEPRO100State),
1892 VMSTATE_UINT32(statistics.fc_rcv_pause, EEPRO100State),
1893 VMSTATE_UINT32(statistics.fc_rcv_unsupported, EEPRO100State),
1894 VMSTATE_UINT16(statistics.xmt_tco_frames, EEPRO100State),
1895 VMSTATE_UINT16(statistics.rcv_tco_frames, EEPRO100State),
1896 /* Configuration bytes. */
1897 VMSTATE_BUFFER(configuration, EEPRO100State),
1898 VMSTATE_END_OF_LIST()
1899 }
1900};
1901
1902static void nic_cleanup(VLANClientState *nc)
1903{
1904 EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
1905
1906 s->nic = NULL;
1907}
1908
1909static int pci_nic_uninit(PCIDevice *pci_dev)
1910{
1911 EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1912
1913 cpu_unregister_io_memory(s->mmio_index);
1914 vmstate_unregister(&pci_dev->qdev, s->vmstate, s);
1915 eeprom93xx_free(&pci_dev->qdev, s->eeprom);
1916 qemu_del_vlan_client(&s->nic->nc);
1917 return 0;
1918}
1919
1920static NetClientInfo net_eepro100_info = {
1921 .type = NET_CLIENT_TYPE_NIC,
1922 .size = sizeof(NICState),
1923 .can_receive = nic_can_receive,
1924 .receive = nic_receive,
1925 .cleanup = nic_cleanup,
1926};
1927
1928static int e100_nic_init(PCIDevice *pci_dev)
1929{
1930 EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1931 E100PCIDeviceInfo *e100_device = DO_UPCAST(E100PCIDeviceInfo, pci.qdev,
1932 pci_dev->qdev.info);
1933
1934 TRACE(OTHER, logout("\n"));
1935
1936 s->device = e100_device->device;
1937
1938 e100_pci_reset(s, e100_device);
1939
1940 /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
1941 * i82559 and later support 64 or 256 word EEPROM. */
1942 s->eeprom = eeprom93xx_new(&pci_dev->qdev, EEPROM_SIZE);
1943
1944 /* Handler for memory-mapped I/O */
1945 s->mmio_index =
1946 cpu_register_io_memory(pci_mmio_read, pci_mmio_write, s,
1947 DEVICE_LITTLE_ENDIAN);
1948
1949 pci_register_bar_simple(&s->dev, 0, PCI_MEM_SIZE,
1950 PCI_BASE_ADDRESS_MEM_PREFETCH, s->mmio_index);
1951
1952 pci_register_bar(&s->dev, 1, PCI_IO_SIZE, PCI_BASE_ADDRESS_SPACE_IO,
1953 pci_map);
1954 pci_register_bar_simple(&s->dev, 2, PCI_FLASH_SIZE, 0, s->mmio_index);
1955
1956 qemu_macaddr_default_if_unset(&s->conf.macaddr);
1957 logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6));
1958 assert(s->region1 == 0);
1959
1960 nic_reset(s);
1961
1962 s->nic = qemu_new_nic(&net_eepro100_info, &s->conf,
1963 pci_dev->qdev.info->name, pci_dev->qdev.id, s);
1964
1965 qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a);
1966 TRACE(OTHER, logout("%s\n", s->nic->nc.info_str));
1967
1968 qemu_register_reset(nic_reset, s);
1969
1970 s->vmstate = qemu_malloc(sizeof(vmstate_eepro100));
1971 memcpy(s->vmstate, &vmstate_eepro100, sizeof(vmstate_eepro100));
1972 s->vmstate->name = s->nic->nc.model;
1973 vmstate_register(&pci_dev->qdev, -1, s->vmstate, s);
1974
1975 add_boot_device_path(s->conf.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
1976
1977 return 0;
1978}
1979
1980static E100PCIDeviceInfo e100_devices[] = {
1981 {
1982 .pci.qdev.name = "i82550",
1983 .pci.qdev.desc = "Intel i82550 Ethernet",
1984 .device = i82550,
1985 /* TODO: check device id. */
1986 .device_id = PCI_DEVICE_ID_INTEL_82551IT,
1987 /* Revision ID: 0x0c, 0x0d, 0x0e. */
1988 .revision = 0x0e,
1989 /* TODO: check size of statistical counters. */
1990 .stats_size = 80,
1991 /* TODO: check extended tcb support. */
1992 .has_extended_tcb_support = true,
1993 .power_management = true,
1994 },{
1995 .pci.qdev.name = "i82551",
1996 .pci.qdev.desc = "Intel i82551 Ethernet",
1997 .device = i82551,
1998 .device_id = PCI_DEVICE_ID_INTEL_82551IT,
1999 /* Revision ID: 0x0f, 0x10. */
2000 .revision = 0x0f,
2001 /* TODO: check size of statistical counters. */
2002 .stats_size = 80,
2003 .has_extended_tcb_support = true,
2004 .power_management = true,
2005 },{
2006 .pci.qdev.name = "i82557a",
2007 .pci.qdev.desc = "Intel i82557A Ethernet",
2008 .device = i82557A,
2009 .device_id = PCI_DEVICE_ID_INTEL_82557,
2010 .revision = 0x01,
2011 .power_management = false,
2012 },{
2013 .pci.qdev.name = "i82557b",
2014 .pci.qdev.desc = "Intel i82557B Ethernet",
2015 .device = i82557B,
2016 .device_id = PCI_DEVICE_ID_INTEL_82557,
2017 .revision = 0x02,
2018 .power_management = false,
2019 },{
2020 .pci.qdev.name = "i82557c",
2021 .pci.qdev.desc = "Intel i82557C Ethernet",
2022 .device = i82557C,
2023 .device_id = PCI_DEVICE_ID_INTEL_82557,
2024 .revision = 0x03,
2025 .power_management = false,
2026 },{
2027 .pci.qdev.name = "i82558a",
2028 .pci.qdev.desc = "Intel i82558A Ethernet",
2029 .device = i82558A,
2030 .device_id = PCI_DEVICE_ID_INTEL_82557,
2031 .revision = 0x04,
2032 .stats_size = 76,
2033 .has_extended_tcb_support = true,
2034 .power_management = true,
2035 },{
2036 .pci.qdev.name = "i82558b",
2037 .pci.qdev.desc = "Intel i82558B Ethernet",
2038 .device = i82558B,
2039 .device_id = PCI_DEVICE_ID_INTEL_82557,
2040 .revision = 0x05,
2041 .stats_size = 76,
2042 .has_extended_tcb_support = true,
2043 .power_management = true,
2044 },{
2045 .pci.qdev.name = "i82559a",
2046 .pci.qdev.desc = "Intel i82559A Ethernet",
2047 .device = i82559A,
2048 .device_id = PCI_DEVICE_ID_INTEL_82557,
2049 .revision = 0x06,
2050 .stats_size = 80,
2051 .has_extended_tcb_support = true,
2052 .power_management = true,
2053 },{
2054 .pci.qdev.name = "i82559b",
2055 .pci.qdev.desc = "Intel i82559B Ethernet",
2056 .device = i82559B,
2057 .device_id = PCI_DEVICE_ID_INTEL_82557,
2058 .revision = 0x07,
2059 .stats_size = 80,
2060 .has_extended_tcb_support = true,
2061 .power_management = true,
2062 },{
2063 .pci.qdev.name = "i82559c",
2064 .pci.qdev.desc = "Intel i82559C Ethernet",
2065 .device = i82559C,
2066 .device_id = PCI_DEVICE_ID_INTEL_82557,
2067#if 0
2068 .revision = 0x08,
2069#endif
2070 /* TODO: Windows wants revision id 0x0c. */
2071 .revision = 0x0c,
2072 .stats_size = 80,
2073 .has_extended_tcb_support = true,
2074 .power_management = true,
2075 },{
2076 .pci.qdev.name = "i82559er",
2077 .pci.qdev.desc = "Intel i82559ER Ethernet",
2078 .device = i82559ER,
2079 .device_id = PCI_DEVICE_ID_INTEL_82551IT,
2080 .revision = 0x09,
2081 .stats_size = 80,
2082 .has_extended_tcb_support = true,
2083 .power_management = true,
2084 },{
2085 .pci.qdev.name = "i82562",
2086 .pci.qdev.desc = "Intel i82562 Ethernet",
2087 .device = i82562,
2088 /* TODO: check device id. */
2089 .device_id = PCI_DEVICE_ID_INTEL_82551IT,
2090 /* TODO: wrong revision id. */
2091 .revision = 0x0e,
2092 .stats_size = 80,
2093 .has_extended_tcb_support = true,
2094 .power_management = true,
2095 },{
2096 /* Toshiba Tecra 8200. */
2097 .pci.qdev.name = "i82801",
2098 .pci.qdev.desc = "Intel i82801 Ethernet",
2099 .device = i82801,
2100 .device_id = 0x2449,
2101 .revision = 0x03,
2102 .stats_size = 80,
2103 .has_extended_tcb_support = true,
2104 .power_management = true,
2105 }
2106};
2107
2108static Property e100_properties[] = {
2109 DEFINE_NIC_PROPERTIES(EEPRO100State, conf),
2110 DEFINE_PROP_END_OF_LIST(),
2111};
2112
2113static void eepro100_register_devices(void)
2114{
2115 size_t i;
2116 for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
2117 PCIDeviceInfo *pci_dev = &e100_devices[i].pci;
2118 /* We use the same rom file for all device ids.
2119 QEMU fixes the device id during rom load. */
2120 pci_dev->romfile = "gpxe-eepro100-80861209.rom";
2121 pci_dev->init = e100_nic_init;
2122 pci_dev->exit = pci_nic_uninit;
2123 pci_dev->qdev.props = e100_properties;
2124 pci_dev->qdev.size = sizeof(EEPRO100State);
2125 pci_qdev_register(pci_dev);
2126 }
2127}
2128
2129device_init(eepro100_register_devices)
This page took 0.042998 seconds and 4 git commands to generate.