xref: /openbmc/qemu/hw/net/eepro100.c (revision cc67f28e)
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 "qemu/osdep.h"
44 #include "qemu/units.h"
45 #include "hw/pci/pci.h"
46 #include "hw/qdev-properties.h"
47 #include "migration/vmstate.h"
48 #include "net/net.h"
49 #include "net/eth.h"
50 #include "hw/nvram/eeprom93xx.h"
51 #include "sysemu/sysemu.h"
52 #include "sysemu/dma.h"
53 #include "sysemu/reset.h"
54 #include "qemu/bitops.h"
55 #include "qemu/module.h"
56 #include "qapi/error.h"
57 
58 /* QEMU sends frames smaller than 60 bytes to ethernet nics.
59  * Such frames are rejected by real nics and their emulations.
60  * To avoid this behaviour, other nic emulations pad received
61  * frames. The following definition enables this padding for
62  * eepro100, too. We keep the define around in case it might
63  * become useful the future if the core networking is ever
64  * changed to pad short packets itself. */
65 #define CONFIG_PAD_RECEIVED_FRAMES
66 
67 /* Debug EEPRO100 card. */
68 #if 0
69 # define DEBUG_EEPRO100
70 #endif
71 
72 #ifdef DEBUG_EEPRO100
73 #define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
74 #else
75 #define logout(fmt, ...) ((void)0)
76 #endif
77 
78 /* Set flags to 0 to disable debug output. */
79 #define INT     1       /* interrupt related actions */
80 #define MDI     1       /* mdi related actions */
81 #define OTHER   1
82 #define RXTX    1
83 #define EEPROM  1       /* eeprom related actions */
84 
85 #define TRACE(flag, command) ((flag) ? (command) : (void)0)
86 
87 #define missing(text) fprintf(stderr, "eepro100: feature is missing in this emulation: " text "\n")
88 
89 #define MAX_ETH_FRAME_SIZE 1514
90 
91 /* This driver supports several different devices which are declared here. */
92 #define i82550          0x82550
93 #define i82551          0x82551
94 #define i82557A         0x82557a
95 #define i82557B         0x82557b
96 #define i82557C         0x82557c
97 #define i82558A         0x82558a
98 #define i82558B         0x82558b
99 #define i82559A         0x82559a
100 #define i82559B         0x82559b
101 #define i82559C         0x82559c
102 #define i82559ER        0x82559e
103 #define i82562          0x82562
104 #define i82801          0x82801
105 
106 /* Use 64 word EEPROM. TODO: could be a runtime option. */
107 #define EEPROM_SIZE     64
108 
109 #define PCI_MEM_SIZE            (4 * KiB)
110 #define PCI_IO_SIZE             64
111 #define PCI_FLASH_SIZE          (128 * KiB)
112 
113 #define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
114 
115 /* The SCB accepts the following controls for the Tx and Rx units: */
116 #define  CU_NOP         0x0000  /* No operation. */
117 #define  CU_START       0x0010  /* CU start. */
118 #define  CU_RESUME      0x0020  /* CU resume. */
119 #define  CU_STATSADDR   0x0040  /* Load dump counters address. */
120 #define  CU_SHOWSTATS   0x0050  /* Dump statistical counters. */
121 #define  CU_CMD_BASE    0x0060  /* Load CU base address. */
122 #define  CU_DUMPSTATS   0x0070  /* Dump and reset statistical counters. */
123 #define  CU_SRESUME     0x00a0  /* CU static resume. */
124 
125 #define  RU_NOP         0x0000
126 #define  RX_START       0x0001
127 #define  RX_RESUME      0x0002
128 #define  RU_ABORT       0x0004
129 #define  RX_ADDR_LOAD   0x0006
130 #define  RX_RESUMENR    0x0007
131 #define INT_MASK        0x0100
132 #define DRVR_INT        0x0200  /* Driver generated interrupt. */
133 
134 typedef struct {
135     const char *name;
136     const char *desc;
137     uint16_t device_id;
138     uint8_t revision;
139     uint16_t subsystem_vendor_id;
140     uint16_t subsystem_id;
141 
142     uint32_t device;
143     uint8_t stats_size;
144     bool has_extended_tcb_support;
145     bool power_management;
146 } E100PCIDeviceInfo;
147 
148 /* Offsets to the various registers.
149    All accesses need not be longword aligned. */
150 typedef enum {
151     SCBStatus = 0,              /* Status Word. */
152     SCBAck = 1,
153     SCBCmd = 2,                 /* Rx/Command Unit command and status. */
154     SCBIntmask = 3,
155     SCBPointer = 4,             /* General purpose pointer. */
156     SCBPort = 8,                /* Misc. commands and operands.  */
157     SCBflash = 12,              /* Flash memory control. */
158     SCBeeprom = 14,             /* EEPROM control. */
159     SCBCtrlMDI = 16,            /* MDI interface control. */
160     SCBEarlyRx = 20,            /* Early receive byte count. */
161     SCBFlow = 24,               /* Flow Control. */
162     SCBpmdr = 27,               /* Power Management Driver. */
163     SCBgctrl = 28,              /* General Control. */
164     SCBgstat = 29,              /* General Status. */
165 } E100RegisterOffset;
166 
167 /* A speedo3 transmit buffer descriptor with two buffers... */
168 typedef struct {
169     uint16_t status;
170     uint16_t command;
171     uint32_t link;              /* void * */
172     uint32_t tbd_array_addr;    /* transmit buffer descriptor array address. */
173     uint16_t tcb_bytes;         /* transmit command block byte count (in lower 14 bits */
174     uint8_t tx_threshold;       /* transmit threshold */
175     uint8_t tbd_count;          /* TBD number */
176 #if 0
177     /* This constitutes two "TBD" entries: hdr and data */
178     uint32_t tx_buf_addr0;  /* void *, header of frame to be transmitted.  */
179     int32_t  tx_buf_size0;  /* Length of Tx hdr. */
180     uint32_t tx_buf_addr1;  /* void *, data to be transmitted.  */
181     int32_t  tx_buf_size1;  /* Length of Tx data. */
182 #endif
183 } eepro100_tx_t;
184 
185 /* Receive frame descriptor. */
186 typedef struct {
187     int16_t status;
188     uint16_t command;
189     uint32_t link;              /* struct RxFD * */
190     uint32_t rx_buf_addr;       /* void * */
191     uint16_t count;
192     uint16_t size;
193     /* Ethernet frame data follows. */
194 } eepro100_rx_t;
195 
196 typedef enum {
197     COMMAND_EL = BIT(15),
198     COMMAND_S = BIT(14),
199     COMMAND_I = BIT(13),
200     COMMAND_NC = BIT(4),
201     COMMAND_SF = BIT(3),
202     COMMAND_CMD = BITS(2, 0),
203 } scb_command_bit;
204 
205 typedef enum {
206     STATUS_C = BIT(15),
207     STATUS_OK = BIT(13),
208 } scb_status_bit;
209 
210 typedef struct {
211     uint32_t tx_good_frames, tx_max_collisions, tx_late_collisions,
212              tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
213              tx_multiple_collisions, tx_total_collisions;
214     uint32_t rx_good_frames, rx_crc_errors, rx_alignment_errors,
215              rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
216              rx_short_frame_errors;
217     uint32_t fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
218     uint16_t xmt_tco_frames, rcv_tco_frames;
219     /* TODO: i82559 has six reserved statistics but a total of 24 dwords. */
220     uint32_t reserved[4];
221 } eepro100_stats_t;
222 
223 typedef enum {
224     cu_idle = 0,
225     cu_suspended = 1,
226     cu_active = 2,
227     cu_lpq_active = 2,
228     cu_hqp_active = 3
229 } cu_state_t;
230 
231 typedef enum {
232     ru_idle = 0,
233     ru_suspended = 1,
234     ru_no_resources = 2,
235     ru_ready = 4
236 } ru_state_t;
237 
238 typedef struct {
239     PCIDevice dev;
240     /* Hash register (multicast mask array, multiple individual addresses). */
241     uint8_t mult[8];
242     MemoryRegion mmio_bar;
243     MemoryRegion io_bar;
244     MemoryRegion flash_bar;
245     NICState *nic;
246     NICConf conf;
247     uint8_t scb_stat;           /* SCB stat/ack byte */
248     uint8_t int_stat;           /* PCI interrupt status */
249     /* region must not be saved by nic_save. */
250     uint16_t mdimem[32];
251     eeprom_t *eeprom;
252     uint32_t device;            /* device variant */
253     /* (cu_base + cu_offset) address the next command block in the command block list. */
254     uint32_t cu_base;           /* CU base address */
255     uint32_t cu_offset;         /* CU address offset */
256     /* (ru_base + ru_offset) address the RFD in the Receive Frame Area. */
257     uint32_t ru_base;           /* RU base address */
258     uint32_t ru_offset;         /* RU address offset */
259     uint32_t statsaddr;         /* pointer to eepro100_stats_t */
260 
261     /* Temporary status information (no need to save these values),
262      * used while processing CU commands. */
263     eepro100_tx_t tx;           /* transmit buffer descriptor */
264     uint32_t cb_address;        /* = cu_base + cu_offset */
265 
266     /* Statistical counters. Also used for wake-up packet (i82559). */
267     eepro100_stats_t statistics;
268 
269     /* Data in mem is always in the byte order of the controller (le).
270      * It must be dword aligned to allow direct access to 32 bit values. */
271     uint8_t mem[PCI_MEM_SIZE] __attribute__((aligned(8)));
272 
273     /* Configuration bytes. */
274     uint8_t configuration[22];
275 
276     /* vmstate for each particular nic */
277     VMStateDescription *vmstate;
278 
279     /* Quasi static device properties (no need to save them). */
280     uint16_t stats_size;
281     bool has_extended_tcb_support;
282 } EEPRO100State;
283 
284 /* Word indices in EEPROM. */
285 typedef enum {
286     EEPROM_CNFG_MDIX  = 0x03,
287     EEPROM_ID         = 0x05,
288     EEPROM_PHY_ID     = 0x06,
289     EEPROM_VENDOR_ID  = 0x0c,
290     EEPROM_CONFIG_ASF = 0x0d,
291     EEPROM_DEVICE_ID  = 0x23,
292     EEPROM_SMBUS_ADDR = 0x90,
293 } EEPROMOffset;
294 
295 /* Bit values for EEPROM ID word. */
296 typedef enum {
297     EEPROM_ID_MDM = BIT(0),     /* Modem */
298     EEPROM_ID_STB = BIT(1),     /* Standby Enable */
299     EEPROM_ID_WMR = BIT(2),     /* ??? */
300     EEPROM_ID_WOL = BIT(5),     /* Wake on LAN */
301     EEPROM_ID_DPD = BIT(6),     /* Deep Power Down */
302     EEPROM_ID_ALT = BIT(7),     /* */
303     /* BITS(10, 8) device revision */
304     EEPROM_ID_BD = BIT(11),     /* boot disable */
305     EEPROM_ID_ID = BIT(13),     /* id bit */
306     /* BITS(15, 14) signature */
307     EEPROM_ID_VALID = BIT(14),  /* signature for valid eeprom */
308 } eeprom_id_bit;
309 
310 /* Default values for MDI (PHY) registers */
311 static const uint16_t eepro100_mdi_default[] = {
312     /* MDI Registers 0 - 6, 7 */
313     0x3000, 0x780d, 0x02a8, 0x0154, 0x05e1, 0x0000, 0x0000, 0x0000,
314     /* MDI Registers 8 - 15 */
315     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
316     /* MDI Registers 16 - 31 */
317     0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
318     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
319 };
320 
321 /* Readonly mask for MDI (PHY) registers */
322 static const uint16_t eepro100_mdi_mask[] = {
323     0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
324     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
325     0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
326     0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
327 };
328 
329 static E100PCIDeviceInfo *eepro100_get_class(EEPRO100State *s);
330 
331 /* Read a 16 bit control/status (CSR) register. */
332 static uint16_t e100_read_reg2(EEPRO100State *s, E100RegisterOffset addr)
333 {
334     assert(!((uintptr_t)&s->mem[addr] & 1));
335     return lduw_le_p(&s->mem[addr]);
336 }
337 
338 /* Read a 32 bit control/status (CSR) register. */
339 static uint32_t e100_read_reg4(EEPRO100State *s, E100RegisterOffset addr)
340 {
341     assert(!((uintptr_t)&s->mem[addr] & 3));
342     return ldl_le_p(&s->mem[addr]);
343 }
344 
345 /* Write a 16 bit control/status (CSR) register. */
346 static void e100_write_reg2(EEPRO100State *s, E100RegisterOffset addr,
347                             uint16_t val)
348 {
349     assert(!((uintptr_t)&s->mem[addr] & 1));
350     stw_le_p(&s->mem[addr], val);
351 }
352 
353 /* Read a 32 bit control/status (CSR) register. */
354 static void e100_write_reg4(EEPRO100State *s, E100RegisterOffset addr,
355                             uint32_t val)
356 {
357     assert(!((uintptr_t)&s->mem[addr] & 3));
358     stl_le_p(&s->mem[addr], val);
359 }
360 
361 #if defined(DEBUG_EEPRO100)
362 static const char *nic_dump(const uint8_t * buf, unsigned size)
363 {
364     static char dump[3 * 16 + 1];
365     char *p = &dump[0];
366     if (size > 16) {
367         size = 16;
368     }
369     while (size-- > 0) {
370         p += sprintf(p, " %02x", *buf++);
371     }
372     return dump;
373 }
374 #endif                          /* DEBUG_EEPRO100 */
375 
376 enum scb_stat_ack {
377     stat_ack_not_ours = 0x00,
378     stat_ack_sw_gen = 0x04,
379     stat_ack_rnr = 0x10,
380     stat_ack_cu_idle = 0x20,
381     stat_ack_frame_rx = 0x40,
382     stat_ack_cu_cmd_done = 0x80,
383     stat_ack_not_present = 0xFF,
384     stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
385     stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
386 };
387 
388 static void disable_interrupt(EEPRO100State * s)
389 {
390     if (s->int_stat) {
391         TRACE(INT, logout("interrupt disabled\n"));
392         pci_irq_deassert(&s->dev);
393         s->int_stat = 0;
394     }
395 }
396 
397 static void enable_interrupt(EEPRO100State * s)
398 {
399     if (!s->int_stat) {
400         TRACE(INT, logout("interrupt enabled\n"));
401         pci_irq_assert(&s->dev);
402         s->int_stat = 1;
403     }
404 }
405 
406 static void eepro100_acknowledge(EEPRO100State * s)
407 {
408     s->scb_stat &= ~s->mem[SCBAck];
409     s->mem[SCBAck] = s->scb_stat;
410     if (s->scb_stat == 0) {
411         disable_interrupt(s);
412     }
413 }
414 
415 static void eepro100_interrupt(EEPRO100State * s, uint8_t status)
416 {
417     uint8_t mask = ~s->mem[SCBIntmask];
418     s->mem[SCBAck] |= status;
419     status = s->scb_stat = s->mem[SCBAck];
420     status &= (mask | 0x0f);
421 #if 0
422     status &= (~s->mem[SCBIntmask] | 0x0xf);
423 #endif
424     if (status && (mask & 0x01)) {
425         /* SCB mask and SCB Bit M do not disable interrupt. */
426         enable_interrupt(s);
427     } else if (s->int_stat) {
428         disable_interrupt(s);
429     }
430 }
431 
432 static void eepro100_cx_interrupt(EEPRO100State * s)
433 {
434     /* CU completed action command. */
435     /* Transmit not ok (82557 only, not in emulation). */
436     eepro100_interrupt(s, 0x80);
437 }
438 
439 static void eepro100_cna_interrupt(EEPRO100State * s)
440 {
441     /* CU left the active state. */
442     eepro100_interrupt(s, 0x20);
443 }
444 
445 static void eepro100_fr_interrupt(EEPRO100State * s)
446 {
447     /* RU received a complete frame. */
448     eepro100_interrupt(s, 0x40);
449 }
450 
451 static void eepro100_rnr_interrupt(EEPRO100State * s)
452 {
453     /* RU is not ready. */
454     eepro100_interrupt(s, 0x10);
455 }
456 
457 static void eepro100_mdi_interrupt(EEPRO100State * s)
458 {
459     /* MDI completed read or write cycle. */
460     eepro100_interrupt(s, 0x08);
461 }
462 
463 static void eepro100_swi_interrupt(EEPRO100State * s)
464 {
465     /* Software has requested an interrupt. */
466     eepro100_interrupt(s, 0x04);
467 }
468 
469 #if 0
470 static void eepro100_fcp_interrupt(EEPRO100State * s)
471 {
472     /* Flow control pause interrupt (82558 and later). */
473     eepro100_interrupt(s, 0x01);
474 }
475 #endif
476 
477 static void e100_pci_reset(EEPRO100State *s, Error **errp)
478 {
479     E100PCIDeviceInfo *info = eepro100_get_class(s);
480     uint32_t device = s->device;
481     uint8_t *pci_conf = s->dev.config;
482 
483     TRACE(OTHER, logout("%p\n", s));
484 
485     /* PCI Status */
486     pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
487                                         PCI_STATUS_FAST_BACK);
488     /* PCI Latency Timer */
489     pci_set_byte(pci_conf + PCI_LATENCY_TIMER, 0x20);   /* latency timer = 32 clocks */
490     /* Capability Pointer is set by PCI framework. */
491     /* Interrupt Line */
492     /* Interrupt Pin */
493     pci_set_byte(pci_conf + PCI_INTERRUPT_PIN, 1);      /* interrupt pin A */
494     /* Minimum Grant */
495     pci_set_byte(pci_conf + PCI_MIN_GNT, 0x08);
496     /* Maximum Latency */
497     pci_set_byte(pci_conf + PCI_MAX_LAT, 0x18);
498 
499     s->stats_size = info->stats_size;
500     s->has_extended_tcb_support = info->has_extended_tcb_support;
501 
502     switch (device) {
503     case i82550:
504     case i82551:
505     case i82557A:
506     case i82557B:
507     case i82557C:
508     case i82558A:
509     case i82558B:
510     case i82559A:
511     case i82559B:
512     case i82559ER:
513     case i82562:
514     case i82801:
515     case i82559C:
516         break;
517     default:
518         logout("Device %X is undefined!\n", device);
519     }
520 
521     /* Standard TxCB. */
522     s->configuration[6] |= BIT(4);
523 
524     /* Standard statistical counters. */
525     s->configuration[6] |= BIT(5);
526 
527     if (s->stats_size == 80) {
528         /* TODO: check TCO Statistical Counters bit. Documentation not clear. */
529         if (s->configuration[6] & BIT(2)) {
530             /* TCO statistical counters. */
531             assert(s->configuration[6] & BIT(5));
532         } else {
533             if (s->configuration[6] & BIT(5)) {
534                 /* No extended statistical counters, i82557 compatible. */
535                 s->stats_size = 64;
536             } else {
537                 /* i82558 compatible. */
538                 s->stats_size = 76;
539             }
540         }
541     } else {
542         if (s->configuration[6] & BIT(5)) {
543             /* No extended statistical counters. */
544             s->stats_size = 64;
545         }
546     }
547     assert(s->stats_size > 0 && s->stats_size <= sizeof(s->statistics));
548 
549     if (info->power_management) {
550         /* Power Management Capabilities */
551         int cfg_offset = 0xdc;
552         int r = pci_add_capability(&s->dev, PCI_CAP_ID_PM,
553                                    cfg_offset, PCI_PM_SIZEOF,
554                                    errp);
555         if (r < 0) {
556             return;
557         }
558 
559         pci_set_word(pci_conf + cfg_offset + PCI_PM_PMC, 0x7e21);
560 #if 0 /* TODO: replace dummy code for power management emulation. */
561         /* TODO: Power Management Control / Status. */
562         pci_set_word(pci_conf + cfg_offset + PCI_PM_CTRL, 0x0000);
563         /* TODO: Ethernet Power Consumption Registers (i82559 and later). */
564         pci_set_byte(pci_conf + cfg_offset + PCI_PM_PPB_EXTENSIONS, 0x0000);
565 #endif
566     }
567 
568 #if EEPROM_SIZE > 0
569     if (device == i82557C || device == i82558B || device == i82559C) {
570         /*
571         TODO: get vendor id from EEPROM for i82557C or later.
572         TODO: get device id from EEPROM for i82557C or later.
573         TODO: status bit 4 can be disabled by EEPROM for i82558, i82559.
574         TODO: header type is determined by EEPROM for i82559.
575         TODO: get subsystem id from EEPROM for i82557C or later.
576         TODO: get subsystem vendor id from EEPROM for i82557C or later.
577         TODO: exp. rom baddr depends on a bit in EEPROM for i82558 or later.
578         TODO: capability pointer depends on EEPROM for i82558.
579         */
580         logout("Get device id and revision from EEPROM!!!\n");
581     }
582 #endif /* EEPROM_SIZE > 0 */
583 }
584 
585 static void nic_selective_reset(EEPRO100State * s)
586 {
587     size_t i;
588     uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
589 #if 0
590     eeprom93xx_reset(s->eeprom);
591 #endif
592     memcpy(eeprom_contents, s->conf.macaddr.a, 6);
593     eeprom_contents[EEPROM_ID] = EEPROM_ID_VALID;
594     if (s->device == i82557B || s->device == i82557C)
595         eeprom_contents[5] = 0x0100;
596     eeprom_contents[EEPROM_PHY_ID] = 1;
597     uint16_t sum = 0;
598     for (i = 0; i < EEPROM_SIZE - 1; i++) {
599         sum += eeprom_contents[i];
600     }
601     eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum;
602     TRACE(EEPROM, logout("checksum=0x%04x\n", eeprom_contents[EEPROM_SIZE - 1]));
603 
604     memset(s->mem, 0, sizeof(s->mem));
605     e100_write_reg4(s, SCBCtrlMDI, BIT(21));
606 
607     assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default));
608     memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem));
609 }
610 
611 static void nic_reset(void *opaque)
612 {
613     EEPRO100State *s = opaque;
614     TRACE(OTHER, logout("%p\n", s));
615     /* TODO: Clearing of hash register for selective reset, too? */
616     memset(&s->mult[0], 0, sizeof(s->mult));
617     nic_selective_reset(s);
618 }
619 
620 #if defined(DEBUG_EEPRO100)
621 static const char * const e100_reg[PCI_IO_SIZE / 4] = {
622     "Command/Status",
623     "General Pointer",
624     "Port",
625     "EEPROM/Flash Control",
626     "MDI Control",
627     "Receive DMA Byte Count",
628     "Flow Control",
629     "General Status/Control"
630 };
631 
632 static char *regname(uint32_t addr)
633 {
634     static char buf[32];
635     if (addr < PCI_IO_SIZE) {
636         const char *r = e100_reg[addr / 4];
637         if (r != 0) {
638             snprintf(buf, sizeof(buf), "%s+%u", r, addr % 4);
639         } else {
640             snprintf(buf, sizeof(buf), "0x%02x", addr);
641         }
642     } else {
643         snprintf(buf, sizeof(buf), "??? 0x%08x", addr);
644     }
645     return buf;
646 }
647 #endif                          /* DEBUG_EEPRO100 */
648 
649 /*****************************************************************************
650  *
651  * Command emulation.
652  *
653  ****************************************************************************/
654 
655 #if 0
656 static uint16_t eepro100_read_command(EEPRO100State * s)
657 {
658     uint16_t val = 0xffff;
659     TRACE(OTHER, logout("val=0x%04x\n", val));
660     return val;
661 }
662 #endif
663 
664 /* Commands that can be put in a command list entry. */
665 enum commands {
666     CmdNOp = 0,
667     CmdIASetup = 1,
668     CmdConfigure = 2,
669     CmdMulticastList = 3,
670     CmdTx = 4,
671     CmdTDR = 5,                 /* load microcode */
672     CmdDump = 6,
673     CmdDiagnose = 7,
674 
675     /* And some extra flags: */
676     CmdSuspend = 0x4000,        /* Suspend after completion. */
677     CmdIntr = 0x2000,           /* Interrupt after completion. */
678     CmdTxFlex = 0x0008,         /* Use "Flexible mode" for CmdTx command. */
679 };
680 
681 static cu_state_t get_cu_state(EEPRO100State * s)
682 {
683     return ((s->mem[SCBStatus] & BITS(7, 6)) >> 6);
684 }
685 
686 static void set_cu_state(EEPRO100State * s, cu_state_t state)
687 {
688     s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(7, 6)) + (state << 6);
689 }
690 
691 static ru_state_t get_ru_state(EEPRO100State * s)
692 {
693     return ((s->mem[SCBStatus] & BITS(5, 2)) >> 2);
694 }
695 
696 static void set_ru_state(EEPRO100State * s, ru_state_t state)
697 {
698     s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(5, 2)) + (state << 2);
699 }
700 
701 static void dump_statistics(EEPRO100State * s)
702 {
703     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
704 
705     /* Dump statistical data. Most data is never changed by the emulation
706      * and always 0, so we first just copy the whole block and then those
707      * values which really matter.
708      * Number of data should check configuration!!!
709      */
710     pci_dma_write(&s->dev, s->statsaddr, &s->statistics, s->stats_size);
711     stl_le_pci_dma(&s->dev, s->statsaddr + 0,
712                    s->statistics.tx_good_frames, attrs);
713     stl_le_pci_dma(&s->dev, s->statsaddr + 36,
714                    s->statistics.rx_good_frames, attrs);
715     stl_le_pci_dma(&s->dev, s->statsaddr + 48,
716                    s->statistics.rx_resource_errors, attrs);
717     stl_le_pci_dma(&s->dev, s->statsaddr + 60,
718                    s->statistics.rx_short_frame_errors, attrs);
719 #if 0
720     stw_le_pci_dma(&s->dev, s->statsaddr + 76,
721                    s->statistics.xmt_tco_frames, attrs);
722     stw_le_pci_dma(&s->dev, s->statsaddr + 78,
723                    s->statistics.rcv_tco_frames, attrs);
724     missing("CU dump statistical counters");
725 #endif
726 }
727 
728 static void read_cb(EEPRO100State *s)
729 {
730     pci_dma_read(&s->dev, s->cb_address, &s->tx, sizeof(s->tx));
731     s->tx.status = le16_to_cpu(s->tx.status);
732     s->tx.command = le16_to_cpu(s->tx.command);
733     s->tx.link = le32_to_cpu(s->tx.link);
734     s->tx.tbd_array_addr = le32_to_cpu(s->tx.tbd_array_addr);
735     s->tx.tcb_bytes = le16_to_cpu(s->tx.tcb_bytes);
736 }
737 
738 static void tx_command(EEPRO100State *s)
739 {
740     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
741     uint32_t tbd_array = s->tx.tbd_array_addr;
742     uint16_t tcb_bytes = s->tx.tcb_bytes & 0x3fff;
743     /* Sends larger than MAX_ETH_FRAME_SIZE are allowed, up to 2600 bytes. */
744     uint8_t buf[2600];
745     uint16_t size = 0;
746     uint32_t tbd_address = s->cb_address + 0x10;
747     TRACE(RXTX, logout
748         ("transmit, TBD array address 0x%08x, TCB byte count 0x%04x, TBD count %u\n",
749          tbd_array, tcb_bytes, s->tx.tbd_count));
750 
751     if (tcb_bytes > 2600) {
752         logout("TCB byte count too large, using 2600\n");
753         tcb_bytes = 2600;
754     }
755     if (!((tcb_bytes > 0) || (tbd_array != 0xffffffff))) {
756         logout
757             ("illegal values of TBD array address and TCB byte count!\n");
758     }
759     assert(tcb_bytes <= sizeof(buf));
760     while (size < tcb_bytes) {
761         TRACE(RXTX, logout
762             ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
763              tbd_address, tcb_bytes));
764         pci_dma_read(&s->dev, tbd_address, &buf[size], tcb_bytes);
765         size += tcb_bytes;
766     }
767     if (tbd_array == 0xffffffff) {
768         /* Simplified mode. Was already handled by code above. */
769     } else {
770         /* Flexible mode. */
771         uint8_t tbd_count = 0;
772         uint32_t tx_buffer_address;
773         uint16_t tx_buffer_size;
774         uint16_t tx_buffer_el;
775 
776         if (s->has_extended_tcb_support && !(s->configuration[6] & BIT(4))) {
777             /* Extended Flexible TCB. */
778             for (; tbd_count < 2; tbd_count++) {
779                 ldl_le_pci_dma(&s->dev, tbd_address, &tx_buffer_address, attrs);
780                 lduw_le_pci_dma(&s->dev, tbd_address + 4, &tx_buffer_size, attrs);
781                 lduw_le_pci_dma(&s->dev, tbd_address + 6, &tx_buffer_el, attrs);
782                 tbd_address += 8;
783                 TRACE(RXTX, logout
784                     ("TBD (extended flexible mode): buffer address 0x%08x, size 0x%04x\n",
785                      tx_buffer_address, tx_buffer_size));
786                 tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
787                 pci_dma_read(&s->dev, tx_buffer_address,
788                              &buf[size], tx_buffer_size);
789                 size += tx_buffer_size;
790                 if (tx_buffer_el & 1) {
791                     break;
792                 }
793             }
794         }
795         tbd_address = tbd_array;
796         for (; tbd_count < s->tx.tbd_count; tbd_count++) {
797             ldl_le_pci_dma(&s->dev, tbd_address, &tx_buffer_address, attrs);
798             lduw_le_pci_dma(&s->dev, tbd_address + 4, &tx_buffer_size, attrs);
799             lduw_le_pci_dma(&s->dev, tbd_address + 6, &tx_buffer_el, attrs);
800             tbd_address += 8;
801             TRACE(RXTX, logout
802                 ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
803                  tx_buffer_address, tx_buffer_size));
804             tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
805             pci_dma_read(&s->dev, tx_buffer_address,
806                          &buf[size], tx_buffer_size);
807             size += tx_buffer_size;
808             if (tx_buffer_el & 1) {
809                 break;
810             }
811         }
812     }
813     TRACE(RXTX, logout("%p sending frame, len=%d,%s\n", s, size, nic_dump(buf, size)));
814     qemu_send_packet(qemu_get_queue(s->nic), buf, size);
815     s->statistics.tx_good_frames++;
816     /* Transmit with bad status would raise an CX/TNO interrupt.
817      * (82557 only). Emulation never has bad status. */
818 #if 0
819     eepro100_cx_interrupt(s);
820 #endif
821 }
822 
823 static void set_multicast_list(EEPRO100State *s)
824 {
825     uint16_t multicast_count = s->tx.tbd_array_addr & BITS(13, 0);
826     uint16_t i;
827     memset(&s->mult[0], 0, sizeof(s->mult));
828     TRACE(OTHER, logout("multicast list, multicast count = %u\n", multicast_count));
829     for (i = 0; i < multicast_count; i += 6) {
830         uint8_t multicast_addr[6];
831         pci_dma_read(&s->dev, s->cb_address + 10 + i, multicast_addr, 6);
832         TRACE(OTHER, logout("multicast entry %s\n", nic_dump(multicast_addr, 6)));
833         unsigned mcast_idx = (net_crc32(multicast_addr, ETH_ALEN) &
834                               BITS(7, 2)) >> 2;
835         assert(mcast_idx < 64);
836         s->mult[mcast_idx >> 3] |= (1 << (mcast_idx & 7));
837     }
838 }
839 
840 static void action_command(EEPRO100State *s)
841 {
842     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
843     /* The loop below won't stop if it gets special handcrafted data.
844        Therefore we limit the number of iterations. */
845     unsigned max_loop_count = 16;
846 
847     for (;;) {
848         bool bit_el;
849         bool bit_s;
850         bool bit_i;
851         bool bit_nc;
852         uint16_t ok_status = STATUS_OK;
853         s->cb_address = s->cu_base + s->cu_offset;
854         read_cb(s);
855         bit_el = ((s->tx.command & COMMAND_EL) != 0);
856         bit_s = ((s->tx.command & COMMAND_S) != 0);
857         bit_i = ((s->tx.command & COMMAND_I) != 0);
858         bit_nc = ((s->tx.command & COMMAND_NC) != 0);
859 #if 0
860         bool bit_sf = ((s->tx.command & COMMAND_SF) != 0);
861 #endif
862 
863         if (max_loop_count-- == 0) {
864             /* Prevent an endless loop. */
865             logout("loop in %s:%u\n", __FILE__, __LINE__);
866             break;
867         }
868 
869         s->cu_offset = s->tx.link;
870         TRACE(OTHER,
871               logout("val=(cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
872                      s->tx.status, s->tx.command, s->tx.link));
873         switch (s->tx.command & COMMAND_CMD) {
874         case CmdNOp:
875             /* Do nothing. */
876             break;
877         case CmdIASetup:
878             pci_dma_read(&s->dev, s->cb_address + 8, &s->conf.macaddr.a[0], 6);
879             TRACE(OTHER, logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6)));
880             break;
881         case CmdConfigure:
882             pci_dma_read(&s->dev, s->cb_address + 8,
883                          &s->configuration[0], sizeof(s->configuration));
884             TRACE(OTHER, logout("configuration: %s\n",
885                                 nic_dump(&s->configuration[0], 16)));
886             TRACE(OTHER, logout("configuration: %s\n",
887                                 nic_dump(&s->configuration[16],
888                                 ARRAY_SIZE(s->configuration) - 16)));
889             if (s->configuration[20] & BIT(6)) {
890                 TRACE(OTHER, logout("Multiple IA bit\n"));
891             }
892             break;
893         case CmdMulticastList:
894             set_multicast_list(s);
895             break;
896         case CmdTx:
897             if (bit_nc) {
898                 missing("CmdTx: NC = 0");
899                 ok_status = 0;
900                 break;
901             }
902             tx_command(s);
903             break;
904         case CmdTDR:
905             TRACE(OTHER, logout("load microcode\n"));
906             /* Starting with offset 8, the command contains
907              * 64 dwords microcode which we just ignore here. */
908             break;
909         case CmdDiagnose:
910             TRACE(OTHER, logout("diagnose\n"));
911             /* Make sure error flag is not set. */
912             s->tx.status = 0;
913             break;
914         default:
915             missing("undefined command");
916             ok_status = 0;
917             break;
918         }
919         /* Write new status. */
920         stw_le_pci_dma(&s->dev, s->cb_address,
921                        s->tx.status | ok_status | STATUS_C, attrs);
922         if (bit_i) {
923             /* CU completed action. */
924             eepro100_cx_interrupt(s);
925         }
926         if (bit_el) {
927             /* CU becomes idle. Terminate command loop. */
928             set_cu_state(s, cu_idle);
929             eepro100_cna_interrupt(s);
930             break;
931         } else if (bit_s) {
932             /* CU becomes suspended. Terminate command loop. */
933             set_cu_state(s, cu_suspended);
934             eepro100_cna_interrupt(s);
935             break;
936         } else {
937             /* More entries in list. */
938             TRACE(OTHER, logout("CU list with at least one more entry\n"));
939         }
940     }
941     TRACE(OTHER, logout("CU list empty\n"));
942     /* List is empty. Now CU is idle or suspended. */
943 }
944 
945 static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
946 {
947     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
948     cu_state_t cu_state;
949     switch (val) {
950     case CU_NOP:
951         /* No operation. */
952         break;
953     case CU_START:
954         cu_state = get_cu_state(s);
955         if (cu_state != cu_idle && cu_state != cu_suspended) {
956             /* Intel documentation says that CU must be idle or suspended
957              * for the CU start command. */
958             logout("unexpected CU state is %u\n", cu_state);
959         }
960         set_cu_state(s, cu_active);
961         s->cu_offset = e100_read_reg4(s, SCBPointer);
962         action_command(s);
963         break;
964     case CU_RESUME:
965         if (get_cu_state(s) != cu_suspended) {
966             logout("bad CU resume from CU state %u\n", get_cu_state(s));
967             /* Workaround for bad Linux eepro100 driver which resumes
968              * from idle state. */
969 #if 0
970             missing("cu resume");
971 #endif
972             set_cu_state(s, cu_suspended);
973         }
974         if (get_cu_state(s) == cu_suspended) {
975             TRACE(OTHER, logout("CU resuming\n"));
976             set_cu_state(s, cu_active);
977             action_command(s);
978         }
979         break;
980     case CU_STATSADDR:
981         /* Load dump counters address. */
982         s->statsaddr = e100_read_reg4(s, SCBPointer);
983         TRACE(OTHER, logout("val=0x%02x (dump counters address)\n", val));
984         if (s->statsaddr & 3) {
985             /* Memory must be Dword aligned. */
986             logout("unaligned dump counters address\n");
987             /* Handling of misaligned addresses is undefined.
988              * Here we align the address by ignoring the lower bits. */
989             /* TODO: Test unaligned dump counter address on real hardware. */
990             s->statsaddr &= ~3;
991         }
992         break;
993     case CU_SHOWSTATS:
994         /* Dump statistical counters. */
995         TRACE(OTHER, logout("val=0x%02x (dump stats)\n", val));
996         dump_statistics(s);
997         stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa005, attrs);
998         break;
999     case CU_CMD_BASE:
1000         /* Load CU base. */
1001         TRACE(OTHER, logout("val=0x%02x (CU base address)\n", val));
1002         s->cu_base = e100_read_reg4(s, SCBPointer);
1003         break;
1004     case CU_DUMPSTATS:
1005         /* Dump and reset statistical counters. */
1006         TRACE(OTHER, logout("val=0x%02x (dump stats and reset)\n", val));
1007         dump_statistics(s);
1008         stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa007, attrs);
1009         memset(&s->statistics, 0, sizeof(s->statistics));
1010         break;
1011     case CU_SRESUME:
1012         /* CU static resume. */
1013         missing("CU static resume");
1014         break;
1015     default:
1016         missing("Undefined CU command");
1017     }
1018 }
1019 
1020 static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
1021 {
1022     switch (val) {
1023     case RU_NOP:
1024         /* No operation. */
1025         break;
1026     case RX_START:
1027         /* RU start. */
1028         if (get_ru_state(s) != ru_idle) {
1029             logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
1030 #if 0
1031             assert(!"wrong RU state");
1032 #endif
1033         }
1034         set_ru_state(s, ru_ready);
1035         s->ru_offset = e100_read_reg4(s, SCBPointer);
1036         qemu_flush_queued_packets(qemu_get_queue(s->nic));
1037         TRACE(OTHER, logout("val=0x%02x (rx start)\n", val));
1038         break;
1039     case RX_RESUME:
1040         /* Restart RU. */
1041         if (get_ru_state(s) != ru_suspended) {
1042             logout("RU state is %u, should be %u\n", get_ru_state(s),
1043                    ru_suspended);
1044 #if 0
1045             assert(!"wrong RU state");
1046 #endif
1047         }
1048         set_ru_state(s, ru_ready);
1049         break;
1050     case RU_ABORT:
1051         /* RU abort. */
1052         if (get_ru_state(s) == ru_ready) {
1053             eepro100_rnr_interrupt(s);
1054         }
1055         set_ru_state(s, ru_idle);
1056         break;
1057     case RX_ADDR_LOAD:
1058         /* Load RU base. */
1059         TRACE(OTHER, logout("val=0x%02x (RU base address)\n", val));
1060         s->ru_base = e100_read_reg4(s, SCBPointer);
1061         break;
1062     default:
1063         logout("val=0x%02x (undefined RU command)\n", val);
1064         missing("Undefined SU command");
1065     }
1066 }
1067 
1068 static void eepro100_write_command(EEPRO100State * s, uint8_t val)
1069 {
1070     eepro100_ru_command(s, val & 0x0f);
1071     eepro100_cu_command(s, val & 0xf0);
1072     if ((val) == 0) {
1073         TRACE(OTHER, logout("val=0x%02x\n", val));
1074     }
1075     /* Clear command byte after command was accepted. */
1076     s->mem[SCBCmd] = 0;
1077 }
1078 
1079 /*****************************************************************************
1080  *
1081  * EEPROM emulation.
1082  *
1083  ****************************************************************************/
1084 
1085 #define EEPROM_CS       0x02
1086 #define EEPROM_SK       0x01
1087 #define EEPROM_DI       0x04
1088 #define EEPROM_DO       0x08
1089 
1090 static uint16_t eepro100_read_eeprom(EEPRO100State * s)
1091 {
1092     uint16_t val = e100_read_reg2(s, SCBeeprom);
1093     if (eeprom93xx_read(s->eeprom)) {
1094         val |= EEPROM_DO;
1095     } else {
1096         val &= ~EEPROM_DO;
1097     }
1098     TRACE(EEPROM, logout("val=0x%04x\n", val));
1099     return val;
1100 }
1101 
1102 static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
1103 {
1104     TRACE(EEPROM, logout("val=0x%02x\n", val));
1105 
1106     /* mask unwritable bits */
1107 #if 0
1108     val = SET_MASKED(val, 0x31, eeprom->value);
1109 #endif
1110 
1111     int eecs = ((val & EEPROM_CS) != 0);
1112     int eesk = ((val & EEPROM_SK) != 0);
1113     int eedi = ((val & EEPROM_DI) != 0);
1114     eeprom93xx_write(eeprom, eecs, eesk, eedi);
1115 }
1116 
1117 /*****************************************************************************
1118  *
1119  * MDI emulation.
1120  *
1121  ****************************************************************************/
1122 
1123 #if defined(DEBUG_EEPRO100)
1124 static const char * const mdi_op_name[] = {
1125     "opcode 0",
1126     "write",
1127     "read",
1128     "opcode 3"
1129 };
1130 
1131 static const char * const mdi_reg_name[] = {
1132     "Control",
1133     "Status",
1134     "PHY Identification (Word 1)",
1135     "PHY Identification (Word 2)",
1136     "Auto-Negotiation Advertisement",
1137     "Auto-Negotiation Link Partner Ability",
1138     "Auto-Negotiation Expansion"
1139 };
1140 
1141 static const char *reg2name(uint8_t reg)
1142 {
1143     static char buffer[10];
1144     const char *p = buffer;
1145     if (reg < ARRAY_SIZE(mdi_reg_name)) {
1146         p = mdi_reg_name[reg];
1147     } else {
1148         snprintf(buffer, sizeof(buffer), "reg=0x%02x", reg);
1149     }
1150     return p;
1151 }
1152 #endif                          /* DEBUG_EEPRO100 */
1153 
1154 static uint32_t eepro100_read_mdi(EEPRO100State * s)
1155 {
1156     uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
1157 
1158 #ifdef DEBUG_EEPRO100
1159     uint8_t raiseint = (val & BIT(29)) >> 29;
1160     uint8_t opcode = (val & BITS(27, 26)) >> 26;
1161     uint8_t phy = (val & BITS(25, 21)) >> 21;
1162     uint8_t reg = (val & BITS(20, 16)) >> 16;
1163     uint16_t data = (val & BITS(15, 0));
1164 #endif
1165     /* Emulation takes no time to finish MDI transaction. */
1166     val |= BIT(28);
1167     TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1168                       val, raiseint, mdi_op_name[opcode], phy,
1169                       reg2name(reg), data));
1170     return val;
1171 }
1172 
1173 static void eepro100_write_mdi(EEPRO100State *s)
1174 {
1175     uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
1176     uint8_t raiseint = (val & BIT(29)) >> 29;
1177     uint8_t opcode = (val & BITS(27, 26)) >> 26;
1178     uint8_t phy = (val & BITS(25, 21)) >> 21;
1179     uint8_t reg = (val & BITS(20, 16)) >> 16;
1180     uint16_t data = (val & BITS(15, 0));
1181     TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1182           val, raiseint, mdi_op_name[opcode], phy, reg2name(reg), data));
1183     if (phy != 1) {
1184         /* Unsupported PHY address. */
1185 #if 0
1186         logout("phy must be 1 but is %u\n", phy);
1187 #endif
1188         data = 0;
1189     } else if (opcode != 1 && opcode != 2) {
1190         /* Unsupported opcode. */
1191         logout("opcode must be 1 or 2 but is %u\n", opcode);
1192         data = 0;
1193     } else if (reg > 6) {
1194         /* Unsupported register. */
1195         logout("register must be 0...6 but is %u\n", reg);
1196         data = 0;
1197     } else {
1198         TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1199                           val, raiseint, mdi_op_name[opcode], phy,
1200                           reg2name(reg), data));
1201         if (opcode == 1) {
1202             /* MDI write */
1203             switch (reg) {
1204             case 0:            /* Control Register */
1205                 if (data & 0x8000) {
1206                     /* Reset status and control registers to default. */
1207                     s->mdimem[0] = eepro100_mdi_default[0];
1208                     s->mdimem[1] = eepro100_mdi_default[1];
1209                     data = s->mdimem[reg];
1210                 } else {
1211                     /* Restart Auto Configuration = Normal Operation */
1212                     data &= ~0x0200;
1213                 }
1214                 break;
1215             case 1:            /* Status Register */
1216                 missing("not writable");
1217                 break;
1218             case 2:            /* PHY Identification Register (Word 1) */
1219             case 3:            /* PHY Identification Register (Word 2) */
1220                 missing("not implemented");
1221                 break;
1222             case 4:            /* Auto-Negotiation Advertisement Register */
1223             case 5:            /* Auto-Negotiation Link Partner Ability Register */
1224                 break;
1225             case 6:            /* Auto-Negotiation Expansion Register */
1226             default:
1227                 missing("not implemented");
1228             }
1229             s->mdimem[reg] &= eepro100_mdi_mask[reg];
1230             s->mdimem[reg] |= data & ~eepro100_mdi_mask[reg];
1231         } else if (opcode == 2) {
1232             /* MDI read */
1233             switch (reg) {
1234             case 0:            /* Control Register */
1235                 if (data & 0x8000) {
1236                     /* Reset status and control registers to default. */
1237                     s->mdimem[0] = eepro100_mdi_default[0];
1238                     s->mdimem[1] = eepro100_mdi_default[1];
1239                 }
1240                 break;
1241             case 1:            /* Status Register */
1242                 s->mdimem[reg] |= 0x0020;
1243                 break;
1244             case 2:            /* PHY Identification Register (Word 1) */
1245             case 3:            /* PHY Identification Register (Word 2) */
1246             case 4:            /* Auto-Negotiation Advertisement Register */
1247                 break;
1248             case 5:            /* Auto-Negotiation Link Partner Ability Register */
1249                 s->mdimem[reg] = 0x41fe;
1250                 break;
1251             case 6:            /* Auto-Negotiation Expansion Register */
1252                 s->mdimem[reg] = 0x0001;
1253                 break;
1254             }
1255             data = s->mdimem[reg];
1256         }
1257         /* Emulation takes no time to finish MDI transaction.
1258          * Set MDI bit in SCB status register. */
1259         s->mem[SCBAck] |= 0x08;
1260         val |= BIT(28);
1261         if (raiseint) {
1262             eepro100_mdi_interrupt(s);
1263         }
1264     }
1265     val = (val & 0xffff0000) + data;
1266     e100_write_reg4(s, SCBCtrlMDI, val);
1267 }
1268 
1269 /*****************************************************************************
1270  *
1271  * Port emulation.
1272  *
1273  ****************************************************************************/
1274 
1275 #define PORT_SOFTWARE_RESET     0
1276 #define PORT_SELFTEST           1
1277 #define PORT_SELECTIVE_RESET    2
1278 #define PORT_DUMP               3
1279 #define PORT_SELECTION_MASK     3
1280 
1281 typedef struct {
1282     uint32_t st_sign;           /* Self Test Signature */
1283     uint32_t st_result;         /* Self Test Results */
1284 } eepro100_selftest_t;
1285 
1286 static uint32_t eepro100_read_port(EEPRO100State * s)
1287 {
1288     return 0;
1289 }
1290 
1291 static void eepro100_write_port(EEPRO100State *s)
1292 {
1293     uint32_t val = e100_read_reg4(s, SCBPort);
1294     uint32_t address = (val & ~PORT_SELECTION_MASK);
1295     uint8_t selection = (val & PORT_SELECTION_MASK);
1296     switch (selection) {
1297     case PORT_SOFTWARE_RESET:
1298         nic_reset(s);
1299         break;
1300     case PORT_SELFTEST:
1301         TRACE(OTHER, logout("selftest address=0x%08x\n", address));
1302         eepro100_selftest_t data;
1303         pci_dma_read(&s->dev, address, (uint8_t *) &data, sizeof(data));
1304         data.st_sign = 0xffffffff;
1305         data.st_result = 0;
1306         pci_dma_write(&s->dev, address, (uint8_t *) &data, sizeof(data));
1307         break;
1308     case PORT_SELECTIVE_RESET:
1309         TRACE(OTHER, logout("selective reset, selftest address=0x%08x\n", address));
1310         nic_selective_reset(s);
1311         break;
1312     default:
1313         logout("val=0x%08x\n", val);
1314         missing("unknown port selection");
1315     }
1316 }
1317 
1318 /*****************************************************************************
1319  *
1320  * General hardware emulation.
1321  *
1322  ****************************************************************************/
1323 
1324 static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
1325 {
1326     uint8_t val = 0;
1327     if (addr <= sizeof(s->mem) - sizeof(val)) {
1328         val = s->mem[addr];
1329     }
1330 
1331     switch (addr) {
1332     case SCBStatus:
1333     case SCBAck:
1334         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1335         break;
1336     case SCBCmd:
1337         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1338 #if 0
1339         val = eepro100_read_command(s);
1340 #endif
1341         break;
1342     case SCBIntmask:
1343         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1344         break;
1345     case SCBPort + 3:
1346         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1347         break;
1348     case SCBeeprom:
1349         val = eepro100_read_eeprom(s);
1350         break;
1351     case SCBCtrlMDI:
1352     case SCBCtrlMDI + 1:
1353     case SCBCtrlMDI + 2:
1354     case SCBCtrlMDI + 3:
1355         val = (uint8_t)(eepro100_read_mdi(s) >> (8 * (addr & 3)));
1356         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1357         break;
1358     case SCBpmdr:       /* Power Management Driver Register */
1359         val = 0;
1360         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1361         break;
1362     case SCBgctrl:      /* General Control Register */
1363         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1364         break;
1365     case SCBgstat:      /* General Status Register */
1366         /* 100 Mbps full duplex, valid link */
1367         val = 0x07;
1368         TRACE(OTHER, logout("addr=General Status val=%02x\n", val));
1369         break;
1370     default:
1371         logout("addr=%s val=0x%02x\n", regname(addr), val);
1372         missing("unknown byte read");
1373     }
1374     return val;
1375 }
1376 
1377 static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
1378 {
1379     uint16_t val = 0;
1380     if (addr <= sizeof(s->mem) - sizeof(val)) {
1381         val = e100_read_reg2(s, addr);
1382     }
1383 
1384     switch (addr) {
1385     case SCBStatus:
1386     case SCBCmd:
1387         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1388         break;
1389     case SCBeeprom:
1390         val = eepro100_read_eeprom(s);
1391         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1392         break;
1393     case SCBCtrlMDI:
1394     case SCBCtrlMDI + 2:
1395         val = (uint16_t)(eepro100_read_mdi(s) >> (8 * (addr & 3)));
1396         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1397         break;
1398     default:
1399         logout("addr=%s val=0x%04x\n", regname(addr), val);
1400         missing("unknown word read");
1401     }
1402     return val;
1403 }
1404 
1405 static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
1406 {
1407     uint32_t val = 0;
1408     if (addr <= sizeof(s->mem) - sizeof(val)) {
1409         val = e100_read_reg4(s, addr);
1410     }
1411 
1412     switch (addr) {
1413     case SCBStatus:
1414         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1415         break;
1416     case SCBPointer:
1417         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1418         break;
1419     case SCBPort:
1420         val = eepro100_read_port(s);
1421         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1422         break;
1423     case SCBflash:
1424         val = eepro100_read_eeprom(s);
1425         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1426         break;
1427     case SCBCtrlMDI:
1428         val = eepro100_read_mdi(s);
1429         break;
1430     default:
1431         logout("addr=%s val=0x%08x\n", regname(addr), val);
1432         missing("unknown longword read");
1433     }
1434     return val;
1435 }
1436 
1437 static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
1438 {
1439     /* SCBStatus is readonly. */
1440     if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
1441         s->mem[addr] = val;
1442     }
1443 
1444     switch (addr) {
1445     case SCBStatus:
1446         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1447         break;
1448     case SCBAck:
1449         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1450         eepro100_acknowledge(s);
1451         break;
1452     case SCBCmd:
1453         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1454         eepro100_write_command(s, val);
1455         break;
1456     case SCBIntmask:
1457         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1458         if (val & BIT(1)) {
1459             eepro100_swi_interrupt(s);
1460         }
1461         eepro100_interrupt(s, 0);
1462         break;
1463     case SCBPointer:
1464     case SCBPointer + 1:
1465     case SCBPointer + 2:
1466     case SCBPointer + 3:
1467         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1468         break;
1469     case SCBPort:
1470     case SCBPort + 1:
1471     case SCBPort + 2:
1472         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1473         break;
1474     case SCBPort + 3:
1475         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1476         eepro100_write_port(s);
1477         break;
1478     case SCBFlow:       /* does not exist on 82557 */
1479     case SCBFlow + 1:
1480     case SCBFlow + 2:
1481     case SCBpmdr:       /* does not exist on 82557 */
1482         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1483         break;
1484     case SCBeeprom:
1485         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1486         eepro100_write_eeprom(s->eeprom, val);
1487         break;
1488     case SCBCtrlMDI:
1489     case SCBCtrlMDI + 1:
1490     case SCBCtrlMDI + 2:
1491         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1492         break;
1493     case SCBCtrlMDI + 3:
1494         TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1495         eepro100_write_mdi(s);
1496         break;
1497     default:
1498         logout("addr=%s val=0x%02x\n", regname(addr), val);
1499         missing("unknown byte write");
1500     }
1501 }
1502 
1503 static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
1504 {
1505     /* SCBStatus is readonly. */
1506     if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
1507         e100_write_reg2(s, addr, val);
1508     }
1509 
1510     switch (addr) {
1511     case SCBStatus:
1512         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1513         s->mem[SCBAck] = (val >> 8);
1514         eepro100_acknowledge(s);
1515         break;
1516     case SCBCmd:
1517         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1518         eepro100_write_command(s, val);
1519         eepro100_write1(s, SCBIntmask, val >> 8);
1520         break;
1521     case SCBPointer:
1522     case SCBPointer + 2:
1523         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1524         break;
1525     case SCBPort:
1526         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1527         break;
1528     case SCBPort + 2:
1529         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1530         eepro100_write_port(s);
1531         break;
1532     case SCBeeprom:
1533         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1534         eepro100_write_eeprom(s->eeprom, val);
1535         break;
1536     case SCBCtrlMDI:
1537         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1538         break;
1539     case SCBCtrlMDI + 2:
1540         TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1541         eepro100_write_mdi(s);
1542         break;
1543     default:
1544         logout("addr=%s val=0x%04x\n", regname(addr), val);
1545         missing("unknown word write");
1546     }
1547 }
1548 
1549 static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
1550 {
1551     if (addr <= sizeof(s->mem) - sizeof(val)) {
1552         e100_write_reg4(s, addr, val);
1553     }
1554 
1555     switch (addr) {
1556     case SCBPointer:
1557         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1558         break;
1559     case SCBPort:
1560         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1561         eepro100_write_port(s);
1562         break;
1563     case SCBflash:
1564         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1565         val = val >> 16;
1566         eepro100_write_eeprom(s->eeprom, val);
1567         break;
1568     case SCBCtrlMDI:
1569         TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1570         eepro100_write_mdi(s);
1571         break;
1572     default:
1573         logout("addr=%s val=0x%08x\n", regname(addr), val);
1574         missing("unknown longword write");
1575     }
1576 }
1577 
1578 static uint64_t eepro100_read(void *opaque, hwaddr addr,
1579                               unsigned size)
1580 {
1581     EEPRO100State *s = opaque;
1582 
1583     switch (size) {
1584     case 1: return eepro100_read1(s, addr);
1585     case 2: return eepro100_read2(s, addr);
1586     case 4: return eepro100_read4(s, addr);
1587     default: abort();
1588     }
1589 }
1590 
1591 static void eepro100_write(void *opaque, hwaddr addr,
1592                            uint64_t data, unsigned size)
1593 {
1594     EEPRO100State *s = opaque;
1595 
1596     switch (size) {
1597     case 1:
1598         eepro100_write1(s, addr, data);
1599         break;
1600     case 2:
1601         eepro100_write2(s, addr, data);
1602         break;
1603     case 4:
1604         eepro100_write4(s, addr, data);
1605         break;
1606     default:
1607         abort();
1608     }
1609 }
1610 
1611 static const MemoryRegionOps eepro100_ops = {
1612     .read = eepro100_read,
1613     .write = eepro100_write,
1614     .endianness = DEVICE_LITTLE_ENDIAN,
1615 };
1616 
1617 static ssize_t nic_receive(NetClientState *nc, const uint8_t * buf, size_t size)
1618 {
1619     /* TODO:
1620      * - Magic packets should set bit 30 in power management driver register.
1621      * - Interesting packets should set bit 29 in power management driver register.
1622      */
1623     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
1624     EEPRO100State *s = qemu_get_nic_opaque(nc);
1625     uint16_t rfd_status = 0xa000;
1626 #if defined(CONFIG_PAD_RECEIVED_FRAMES)
1627     uint8_t min_buf[60];
1628 #endif
1629     static const uint8_t broadcast_macaddr[6] =
1630         { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1631 
1632 #if defined(CONFIG_PAD_RECEIVED_FRAMES)
1633     /* Pad to minimum Ethernet frame length */
1634     if (size < sizeof(min_buf)) {
1635         memcpy(min_buf, buf, size);
1636         memset(&min_buf[size], 0, sizeof(min_buf) - size);
1637         buf = min_buf;
1638         size = sizeof(min_buf);
1639     }
1640 #endif
1641 
1642     if (s->configuration[8] & 0x80) {
1643         /* CSMA is disabled. */
1644         logout("%p received while CSMA is disabled\n", s);
1645         return -1;
1646 #if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1647     } else if (size < 64 && (s->configuration[7] & BIT(0))) {
1648         /* Short frame and configuration byte 7/0 (discard short receive) set:
1649          * Short frame is discarded */
1650         logout("%p received short frame (%zu byte)\n", s, size);
1651         s->statistics.rx_short_frame_errors++;
1652         return -1;
1653 #endif
1654     } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & BIT(3))) {
1655         /* Long frame and configuration byte 18/3 (long receive ok) not set:
1656          * Long frames are discarded. */
1657         logout("%p received long frame (%zu byte), ignored\n", s, size);
1658         return -1;
1659     } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) {       /* !!! */
1660         /* Frame matches individual address. */
1661         /* TODO: check configuration byte 15/4 (ignore U/L). */
1662         TRACE(RXTX, logout("%p received frame for me, len=%zu\n", s, size));
1663     } else if (memcmp(buf, broadcast_macaddr, 6) == 0) {
1664         /* Broadcast frame. */
1665         TRACE(RXTX, logout("%p received broadcast, len=%zu\n", s, size));
1666         rfd_status |= 0x0002;
1667     } else if (buf[0] & 0x01) {
1668         /* Multicast frame. */
1669         TRACE(RXTX, logout("%p received multicast, len=%zu,%s\n", s, size, nic_dump(buf, size)));
1670         if (s->configuration[21] & BIT(3)) {
1671           /* Multicast all bit is set, receive all multicast frames. */
1672         } else {
1673           unsigned mcast_idx = (net_crc32(buf, ETH_ALEN) & BITS(7, 2)) >> 2;
1674           assert(mcast_idx < 64);
1675           if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
1676             /* Multicast frame is allowed in hash table. */
1677           } else if (s->configuration[15] & BIT(0)) {
1678               /* Promiscuous: receive all. */
1679               rfd_status |= 0x0004;
1680           } else {
1681               TRACE(RXTX, logout("%p multicast ignored\n", s));
1682               return -1;
1683           }
1684         }
1685         /* TODO: Next not for promiscuous mode? */
1686         rfd_status |= 0x0002;
1687     } else if (s->configuration[15] & BIT(0)) {
1688         /* Promiscuous: receive all. */
1689         TRACE(RXTX, logout("%p received frame in promiscuous mode, len=%zu\n", s, size));
1690         rfd_status |= 0x0004;
1691     } else if (s->configuration[20] & BIT(6)) {
1692         /* Multiple IA bit set. */
1693         unsigned mcast_idx = net_crc32(buf, ETH_ALEN) >> 26;
1694         assert(mcast_idx < 64);
1695         if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
1696             TRACE(RXTX, logout("%p accepted, multiple IA bit set\n", s));
1697         } else {
1698             TRACE(RXTX, logout("%p frame ignored, multiple IA bit set\n", s));
1699             return -1;
1700         }
1701     } else {
1702         TRACE(RXTX, logout("%p received frame, ignored, len=%zu,%s\n", s, size,
1703               nic_dump(buf, size)));
1704         return size;
1705     }
1706 
1707     if (get_ru_state(s) != ru_ready) {
1708         /* No resources available. */
1709         logout("no resources, state=%u\n", get_ru_state(s));
1710         /* TODO: RNR interrupt only at first failed frame? */
1711         eepro100_rnr_interrupt(s);
1712         s->statistics.rx_resource_errors++;
1713 #if 0
1714         assert(!"no resources");
1715 #endif
1716         return -1;
1717     }
1718     /* !!! */
1719     eepro100_rx_t rx;
1720     pci_dma_read(&s->dev, s->ru_base + s->ru_offset,
1721                  &rx, sizeof(eepro100_rx_t));
1722     uint16_t rfd_command = le16_to_cpu(rx.command);
1723     uint16_t rfd_size = le16_to_cpu(rx.size);
1724 
1725     if (size > rfd_size) {
1726         logout("Receive buffer (%" PRId16 " bytes) too small for data "
1727             "(%zu bytes); data truncated\n", rfd_size, size);
1728         size = rfd_size;
1729     }
1730 #if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1731     if (size < 64) {
1732         rfd_status |= 0x0080;
1733     }
1734 #endif
1735     TRACE(OTHER, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n",
1736           rfd_command, rx.link, rx.rx_buf_addr, rfd_size));
1737     stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset +
1738                 offsetof(eepro100_rx_t, status), rfd_status, attrs);
1739     stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset +
1740                 offsetof(eepro100_rx_t, count), size, attrs);
1741     /* Early receive interrupt not supported. */
1742 #if 0
1743     eepro100_er_interrupt(s);
1744 #endif
1745     /* Receive CRC Transfer not supported. */
1746     if (s->configuration[18] & BIT(2)) {
1747         missing("Receive CRC Transfer");
1748         return -1;
1749     }
1750     /* TODO: check stripping enable bit. */
1751 #if 0
1752     assert(!(s->configuration[17] & BIT(0)));
1753 #endif
1754     pci_dma_write(&s->dev, s->ru_base + s->ru_offset +
1755                   sizeof(eepro100_rx_t), buf, size);
1756     s->statistics.rx_good_frames++;
1757     eepro100_fr_interrupt(s);
1758     s->ru_offset = le32_to_cpu(rx.link);
1759     if (rfd_command & COMMAND_EL) {
1760         /* EL bit is set, so this was the last frame. */
1761         logout("receive: Running out of frames\n");
1762         set_ru_state(s, ru_no_resources);
1763         eepro100_rnr_interrupt(s);
1764     }
1765     if (rfd_command & COMMAND_S) {
1766         /* S bit is set. */
1767         set_ru_state(s, ru_suspended);
1768     }
1769     return size;
1770 }
1771 
1772 static const VMStateDescription vmstate_eepro100 = {
1773     .version_id = 3,
1774     .minimum_version_id = 2,
1775     .fields = (VMStateField[]) {
1776         VMSTATE_PCI_DEVICE(dev, EEPRO100State),
1777         VMSTATE_UNUSED(32),
1778         VMSTATE_BUFFER(mult, EEPRO100State),
1779         VMSTATE_BUFFER(mem, EEPRO100State),
1780         /* Save all members of struct between scb_stat and mem. */
1781         VMSTATE_UINT8(scb_stat, EEPRO100State),
1782         VMSTATE_UINT8(int_stat, EEPRO100State),
1783         VMSTATE_UNUSED(3*4),
1784         VMSTATE_MACADDR(conf.macaddr, EEPRO100State),
1785         VMSTATE_UNUSED(19*4),
1786         VMSTATE_UINT16_ARRAY(mdimem, EEPRO100State, 32),
1787         /* The eeprom should be saved and restored by its own routines. */
1788         VMSTATE_UINT32(device, EEPRO100State),
1789         /* TODO check device. */
1790         VMSTATE_UINT32(cu_base, EEPRO100State),
1791         VMSTATE_UINT32(cu_offset, EEPRO100State),
1792         VMSTATE_UINT32(ru_base, EEPRO100State),
1793         VMSTATE_UINT32(ru_offset, EEPRO100State),
1794         VMSTATE_UINT32(statsaddr, EEPRO100State),
1795         /* Save eepro100_stats_t statistics. */
1796         VMSTATE_UINT32(statistics.tx_good_frames, EEPRO100State),
1797         VMSTATE_UINT32(statistics.tx_max_collisions, EEPRO100State),
1798         VMSTATE_UINT32(statistics.tx_late_collisions, EEPRO100State),
1799         VMSTATE_UINT32(statistics.tx_underruns, EEPRO100State),
1800         VMSTATE_UINT32(statistics.tx_lost_crs, EEPRO100State),
1801         VMSTATE_UINT32(statistics.tx_deferred, EEPRO100State),
1802         VMSTATE_UINT32(statistics.tx_single_collisions, EEPRO100State),
1803         VMSTATE_UINT32(statistics.tx_multiple_collisions, EEPRO100State),
1804         VMSTATE_UINT32(statistics.tx_total_collisions, EEPRO100State),
1805         VMSTATE_UINT32(statistics.rx_good_frames, EEPRO100State),
1806         VMSTATE_UINT32(statistics.rx_crc_errors, EEPRO100State),
1807         VMSTATE_UINT32(statistics.rx_alignment_errors, EEPRO100State),
1808         VMSTATE_UINT32(statistics.rx_resource_errors, EEPRO100State),
1809         VMSTATE_UINT32(statistics.rx_overrun_errors, EEPRO100State),
1810         VMSTATE_UINT32(statistics.rx_cdt_errors, EEPRO100State),
1811         VMSTATE_UINT32(statistics.rx_short_frame_errors, EEPRO100State),
1812         VMSTATE_UINT32(statistics.fc_xmt_pause, EEPRO100State),
1813         VMSTATE_UINT32(statistics.fc_rcv_pause, EEPRO100State),
1814         VMSTATE_UINT32(statistics.fc_rcv_unsupported, EEPRO100State),
1815         VMSTATE_UINT16(statistics.xmt_tco_frames, EEPRO100State),
1816         VMSTATE_UINT16(statistics.rcv_tco_frames, EEPRO100State),
1817         /* Configuration bytes. */
1818         VMSTATE_BUFFER(configuration, EEPRO100State),
1819         VMSTATE_END_OF_LIST()
1820     }
1821 };
1822 
1823 static void pci_nic_uninit(PCIDevice *pci_dev)
1824 {
1825     EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1826 
1827     vmstate_unregister(VMSTATE_IF(&pci_dev->qdev), s->vmstate, s);
1828     g_free(s->vmstate);
1829     eeprom93xx_free(&pci_dev->qdev, s->eeprom);
1830     qemu_del_nic(s->nic);
1831 }
1832 
1833 static NetClientInfo net_eepro100_info = {
1834     .type = NET_CLIENT_DRIVER_NIC,
1835     .size = sizeof(NICState),
1836     .receive = nic_receive,
1837 };
1838 
1839 static void e100_nic_realize(PCIDevice *pci_dev, Error **errp)
1840 {
1841     EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1842     E100PCIDeviceInfo *info = eepro100_get_class(s);
1843     Error *local_err = NULL;
1844 
1845     TRACE(OTHER, logout("\n"));
1846 
1847     s->device = info->device;
1848 
1849     e100_pci_reset(s, &local_err);
1850     if (local_err) {
1851         error_propagate(errp, local_err);
1852         return;
1853     }
1854 
1855     /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
1856      * i82559 and later support 64 or 256 word EEPROM. */
1857     s->eeprom = eeprom93xx_new(&pci_dev->qdev, EEPROM_SIZE);
1858 
1859     /* Handler for memory-mapped I/O */
1860     memory_region_init_io(&s->mmio_bar, OBJECT(s), &eepro100_ops, s,
1861                           "eepro100-mmio", PCI_MEM_SIZE);
1862     pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->mmio_bar);
1863     memory_region_init_io(&s->io_bar, OBJECT(s), &eepro100_ops, s,
1864                           "eepro100-io", PCI_IO_SIZE);
1865     pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->io_bar);
1866     /* FIXME: flash aliases to mmio?! */
1867     memory_region_init_io(&s->flash_bar, OBJECT(s), &eepro100_ops, s,
1868                           "eepro100-flash", PCI_FLASH_SIZE);
1869     pci_register_bar(&s->dev, 2, 0, &s->flash_bar);
1870 
1871     qemu_macaddr_default_if_unset(&s->conf.macaddr);
1872     logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6));
1873 
1874     nic_reset(s);
1875 
1876     s->nic = qemu_new_nic(&net_eepro100_info, &s->conf,
1877                           object_get_typename(OBJECT(pci_dev)), pci_dev->qdev.id, s);
1878 
1879     qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
1880     TRACE(OTHER, logout("%s\n", qemu_get_queue(s->nic)->info_str));
1881 
1882     qemu_register_reset(nic_reset, s);
1883 
1884     s->vmstate = g_memdup(&vmstate_eepro100, sizeof(vmstate_eepro100));
1885     s->vmstate->name = qemu_get_queue(s->nic)->model;
1886     vmstate_register(VMSTATE_IF(&pci_dev->qdev), VMSTATE_INSTANCE_ID_ANY,
1887                      s->vmstate, s);
1888 }
1889 
1890 static void eepro100_instance_init(Object *obj)
1891 {
1892     EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, PCI_DEVICE(obj));
1893     device_add_bootindex_property(obj, &s->conf.bootindex,
1894                                   "bootindex", "/ethernet-phy@0",
1895                                   DEVICE(s));
1896 }
1897 
1898 static E100PCIDeviceInfo e100_devices[] = {
1899     {
1900         .name = "i82550",
1901         .desc = "Intel i82550 Ethernet",
1902         .device = i82550,
1903         /* TODO: check device id. */
1904         .device_id = PCI_DEVICE_ID_INTEL_82551IT,
1905         /* Revision ID: 0x0c, 0x0d, 0x0e. */
1906         .revision = 0x0e,
1907         /* TODO: check size of statistical counters. */
1908         .stats_size = 80,
1909         /* TODO: check extended tcb support. */
1910         .has_extended_tcb_support = true,
1911         .power_management = true,
1912     },{
1913         .name = "i82551",
1914         .desc = "Intel i82551 Ethernet",
1915         .device = i82551,
1916         .device_id = PCI_DEVICE_ID_INTEL_82551IT,
1917         /* Revision ID: 0x0f, 0x10. */
1918         .revision = 0x0f,
1919         /* TODO: check size of statistical counters. */
1920         .stats_size = 80,
1921         .has_extended_tcb_support = true,
1922         .power_management = true,
1923     },{
1924         .name = "i82557a",
1925         .desc = "Intel i82557A Ethernet",
1926         .device = i82557A,
1927         .device_id = PCI_DEVICE_ID_INTEL_82557,
1928         .revision = 0x01,
1929         .power_management = false,
1930     },{
1931         .name = "i82557b",
1932         .desc = "Intel i82557B Ethernet",
1933         .device = i82557B,
1934         .device_id = PCI_DEVICE_ID_INTEL_82557,
1935         .revision = 0x02,
1936         .power_management = false,
1937     },{
1938         .name = "i82557c",
1939         .desc = "Intel i82557C Ethernet",
1940         .device = i82557C,
1941         .device_id = PCI_DEVICE_ID_INTEL_82557,
1942         .revision = 0x03,
1943         .power_management = false,
1944     },{
1945         .name = "i82558a",
1946         .desc = "Intel i82558A Ethernet",
1947         .device = i82558A,
1948         .device_id = PCI_DEVICE_ID_INTEL_82557,
1949         .revision = 0x04,
1950         .stats_size = 76,
1951         .has_extended_tcb_support = true,
1952         .power_management = true,
1953     },{
1954         .name = "i82558b",
1955         .desc = "Intel i82558B Ethernet",
1956         .device = i82558B,
1957         .device_id = PCI_DEVICE_ID_INTEL_82557,
1958         .revision = 0x05,
1959         .stats_size = 76,
1960         .has_extended_tcb_support = true,
1961         .power_management = true,
1962     },{
1963         .name = "i82559a",
1964         .desc = "Intel i82559A Ethernet",
1965         .device = i82559A,
1966         .device_id = PCI_DEVICE_ID_INTEL_82557,
1967         .revision = 0x06,
1968         .stats_size = 80,
1969         .has_extended_tcb_support = true,
1970         .power_management = true,
1971     },{
1972         .name = "i82559b",
1973         .desc = "Intel i82559B Ethernet",
1974         .device = i82559B,
1975         .device_id = PCI_DEVICE_ID_INTEL_82557,
1976         .revision = 0x07,
1977         .stats_size = 80,
1978         .has_extended_tcb_support = true,
1979         .power_management = true,
1980     },{
1981         .name = "i82559c",
1982         .desc = "Intel i82559C Ethernet",
1983         .device = i82559C,
1984         .device_id = PCI_DEVICE_ID_INTEL_82557,
1985 #if 0
1986         .revision = 0x08,
1987 #endif
1988         /* TODO: Windows wants revision id 0x0c. */
1989         .revision = 0x0c,
1990 #if EEPROM_SIZE > 0
1991         .subsystem_vendor_id = PCI_VENDOR_ID_INTEL,
1992         .subsystem_id = 0x0040,
1993 #endif
1994         .stats_size = 80,
1995         .has_extended_tcb_support = true,
1996         .power_management = true,
1997     },{
1998         .name = "i82559er",
1999         .desc = "Intel i82559ER Ethernet",
2000         .device = i82559ER,
2001         .device_id = PCI_DEVICE_ID_INTEL_82551IT,
2002         .revision = 0x09,
2003         .stats_size = 80,
2004         .has_extended_tcb_support = true,
2005         .power_management = true,
2006     },{
2007         .name = "i82562",
2008         .desc = "Intel i82562 Ethernet",
2009         .device = i82562,
2010         /* TODO: check device id. */
2011         .device_id = PCI_DEVICE_ID_INTEL_82551IT,
2012         /* TODO: wrong revision id. */
2013         .revision = 0x0e,
2014         .stats_size = 80,
2015         .has_extended_tcb_support = true,
2016         .power_management = true,
2017     },{
2018         /* Toshiba Tecra 8200. */
2019         .name = "i82801",
2020         .desc = "Intel i82801 Ethernet",
2021         .device = i82801,
2022         .device_id = 0x2449,
2023         .revision = 0x03,
2024         .stats_size = 80,
2025         .has_extended_tcb_support = true,
2026         .power_management = true,
2027     }
2028 };
2029 
2030 static E100PCIDeviceInfo *eepro100_get_class_by_name(const char *typename)
2031 {
2032     E100PCIDeviceInfo *info = NULL;
2033     int i;
2034 
2035     /* This is admittedly awkward but also temporary.  QOM allows for
2036      * parameterized typing and for subclassing both of which would suitable
2037      * handle what's going on here.  But class_data is already being used as
2038      * a stop-gap hack to allow incremental qdev conversion so we cannot use it
2039      * right now.  Once we merge the final QOM series, we can come back here and
2040      * do this in a much more elegant fashion.
2041      */
2042     for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
2043         if (strcmp(e100_devices[i].name, typename) == 0) {
2044             info = &e100_devices[i];
2045             break;
2046         }
2047     }
2048     assert(info != NULL);
2049 
2050     return info;
2051 }
2052 
2053 static E100PCIDeviceInfo *eepro100_get_class(EEPRO100State *s)
2054 {
2055     return eepro100_get_class_by_name(object_get_typename(OBJECT(s)));
2056 }
2057 
2058 static Property e100_properties[] = {
2059     DEFINE_NIC_PROPERTIES(EEPRO100State, conf),
2060     DEFINE_PROP_END_OF_LIST(),
2061 };
2062 
2063 static void eepro100_class_init(ObjectClass *klass, void *data)
2064 {
2065     DeviceClass *dc = DEVICE_CLASS(klass);
2066     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2067     E100PCIDeviceInfo *info;
2068 
2069     info = eepro100_get_class_by_name(object_class_get_name(klass));
2070 
2071     set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
2072     device_class_set_props(dc, e100_properties);
2073     dc->desc = info->desc;
2074     k->vendor_id = PCI_VENDOR_ID_INTEL;
2075     k->class_id = PCI_CLASS_NETWORK_ETHERNET;
2076     k->romfile = "pxe-eepro100.rom";
2077     k->realize = e100_nic_realize;
2078     k->exit = pci_nic_uninit;
2079     k->device_id = info->device_id;
2080     k->revision = info->revision;
2081     k->subsystem_vendor_id = info->subsystem_vendor_id;
2082     k->subsystem_id = info->subsystem_id;
2083 }
2084 
2085 static void eepro100_register_types(void)
2086 {
2087     size_t i;
2088     for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
2089         TypeInfo type_info = {};
2090         E100PCIDeviceInfo *info = &e100_devices[i];
2091 
2092         type_info.name = info->name;
2093         type_info.parent = TYPE_PCI_DEVICE;
2094         type_info.class_init = eepro100_class_init;
2095         type_info.instance_size = sizeof(EEPRO100State);
2096         type_info.instance_init = eepro100_instance_init;
2097         type_info.interfaces = (InterfaceInfo[]) {
2098             { INTERFACE_CONVENTIONAL_PCI_DEVICE },
2099             { },
2100         };
2101 
2102         type_register(&type_info);
2103     }
2104 }
2105 
2106 type_init(eepro100_register_types)
2107