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