microblaze: linux-user support.
[qemu] / hw / eepro100.c
1 /*
2  * QEMU i8255x (PRO100) emulation
3  *
4  * Copyright (c) 2006-2007 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) 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, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22  *
23  * Tested features (i82559):
24  *      PXE boot (i386) no valid link
25  *      Linux networking (i386) ok
26  *
27  * Untested:
28  *      non-i386 platforms
29  *      Windows networking
30  *
31  * References:
32  *
33  * Intel 8255x 10/100 Mbps Ethernet Controller Family
34  * Open Source Software Developer Manual
35  */
36
37 #if defined(TARGET_I386)
38 # warning "PXE boot still not working!"
39 #endif
40
41 #include <stddef.h>             /* offsetof */
42 #include "hw.h"
43 #include "pci.h"
44 #include "net.h"
45 #include "eeprom93xx.h"
46
47 /* Common declarations for all PCI devices. */
48
49 #define PCI_CONFIG_8(offset, value) \
50     (pci_conf[offset] = (value))
51 #define PCI_CONFIG_16(offset, value) \
52     (*(uint16_t *)&pci_conf[offset] = cpu_to_le16(value))
53 #define PCI_CONFIG_32(offset, value) \
54     (*(uint32_t *)&pci_conf[offset] = cpu_to_le32(value))
55
56 #define KiB 1024
57
58 /* debug EEPRO100 card */
59 //~ #define DEBUG_EEPRO100
60
61 #ifdef DEBUG_EEPRO100
62 #define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
63 #else
64 #define logout(fmt, ...) ((void)0)
65 #endif
66
67 /* Set flags to 0 to disable debug output. */
68 #define MDI     0
69
70 #define TRACE(flag, command) ((flag) ? (command) : (void)0)
71
72 #define missing(text)       assert(!"feature is missing in this emulation: " text)
73
74 #define MAX_ETH_FRAME_SIZE 1514
75
76 /* This driver supports several different devices which are declared here. */
77 #define i82551          0x82551
78 #define i82557B         0x82557b
79 #define i82557C         0x82557c
80 #define i82558B         0x82558b
81 #define i82559C         0x82559c
82 #define i82559ER        0x82559e
83 #define i82562          0x82562
84
85 #define EEPROM_SIZE     64
86
87 #define PCI_MEM_SIZE            (4 * KiB)
88 #define PCI_IO_SIZE             64
89 #define PCI_FLASH_SIZE          (128 * KiB)
90
91 #define BIT(n) (1 << (n))
92 #define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
93
94 /* The SCB accepts the following controls for the Tx and Rx units: */
95 #define  CU_NOP         0x0000  /* No operation. */
96 #define  CU_START       0x0010  /* CU start. */
97 #define  CU_RESUME      0x0020  /* CU resume. */
98 #define  CU_STATSADDR   0x0040  /* Load dump counters address. */
99 #define  CU_SHOWSTATS   0x0050  /* Dump statistical counters. */
100 #define  CU_CMD_BASE    0x0060  /* Load CU base address. */
101 #define  CU_DUMPSTATS   0x0070  /* Dump and reset statistical counters. */
102 #define  CU_SRESUME     0x00a0  /* CU static resume. */
103
104 #define  RU_NOP         0x0000
105 #define  RX_START       0x0001
106 #define  RX_RESUME      0x0002
107 #define  RX_ABORT       0x0004
108 #define  RX_ADDR_LOAD   0x0006
109 #define  RX_RESUMENR    0x0007
110 #define INT_MASK        0x0100
111 #define DRVR_INT        0x0200  /* Driver generated interrupt. */
112
113 typedef unsigned char bool;
114
115 /* Offsets to the various registers.
116    All accesses need not be longword aligned. */
117 enum speedo_offsets {
118     SCBStatus = 0,
119     SCBAck = 1,
120     SCBCmd = 2,                 /* Rx/Command Unit command and status. */
121     SCBIntmask = 3,
122     SCBPointer = 4,             /* General purpose pointer. */
123     SCBPort = 8,                /* Misc. commands and operands.  */
124     SCBflash = 12, SCBeeprom = 14,      /* EEPROM and flash memory control. */
125     SCBCtrlMDI = 16,            /* MDI interface control. */
126     SCBEarlyRx = 20,            /* Early receive byte count. */
127     SCBFlow = 24,
128 };
129
130 /* A speedo3 transmit buffer descriptor with two buffers... */
131 typedef struct {
132     uint16_t status;
133     uint16_t command;
134     uint32_t link;              /* void * */
135     uint32_t tx_desc_addr;      /* transmit buffer decsriptor array address. */
136     uint16_t tcb_bytes;         /* transmit command block byte count (in lower 14 bits */
137     uint8_t tx_threshold;       /* transmit threshold */
138     uint8_t tbd_count;          /* TBD number */
139     //~ /* This constitutes two "TBD" entries: hdr and data */
140     //~ uint32_t tx_buf_addr0;  /* void *, header of frame to be transmitted.  */
141     //~ int32_t  tx_buf_size0;  /* Length of Tx hdr. */
142     //~ uint32_t tx_buf_addr1;  /* void *, data to be transmitted.  */
143     //~ int32_t  tx_buf_size1;  /* Length of Tx data. */
144 } eepro100_tx_t;
145
146 /* Receive frame descriptor. */
147 typedef struct {
148     int16_t status;
149     uint16_t command;
150     uint32_t link;              /* struct RxFD * */
151     uint32_t rx_buf_addr;       /* void * */
152     uint16_t count;
153     uint16_t size;
154     char packet[MAX_ETH_FRAME_SIZE + 4];
155 } eepro100_rx_t;
156
157 typedef struct {
158     uint32_t tx_good_frames, tx_max_collisions, tx_late_collisions,
159         tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
160         tx_multiple_collisions, tx_total_collisions;
161     uint32_t rx_good_frames, rx_crc_errors, rx_alignment_errors,
162         rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
163         rx_short_frame_errors;
164     uint32_t fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
165     uint16_t xmt_tco_frames, rcv_tco_frames;
166     uint32_t complete;
167 } eepro100_stats_t;
168
169 typedef enum {
170     cu_idle = 0,
171     cu_suspended = 1,
172     cu_active = 2,
173     cu_lpq_active = 2,
174     cu_hqp_active = 3
175 } cu_state_t;
176
177 typedef enum {
178     ru_idle = 0,
179     ru_suspended = 1,
180     ru_no_resources = 2,
181     ru_ready = 4
182 } ru_state_t;
183
184 typedef struct {
185 #if 1
186     uint8_t cmd;
187     uint32_t start;
188     uint32_t stop;
189     uint8_t boundary;
190     uint8_t tsr;
191     uint8_t tpsr;
192     uint16_t tcnt;
193     uint16_t rcnt;
194     uint32_t rsar;
195     uint8_t rsr;
196     uint8_t rxcr;
197     uint8_t isr;
198     uint8_t dcfg;
199     uint8_t imr;
200     uint8_t phys[6];            /* mac address */
201     uint8_t curpag;
202     uint8_t mult[8];            /* multicast mask array */
203     int mmio_index;
204     PCIDevice *pci_dev;
205     VLANClientState *vc;
206 #endif
207     uint8_t scb_stat;           /* SCB stat/ack byte */
208     uint8_t int_stat;           /* PCI interrupt status */
209     uint32_t region[3];         /* PCI region addresses */
210     uint8_t macaddr[6];
211     uint32_t statcounter[19];
212     uint16_t mdimem[32];
213     eeprom_t *eeprom;
214     uint32_t device;            /* device variant */
215     uint32_t pointer;
216     /* (cu_base + cu_offset) address the next command block in the command block list. */
217     uint32_t cu_base;           /* CU base address */
218     uint32_t cu_offset;         /* CU address offset */
219     /* (ru_base + ru_offset) address the RFD in the Receive Frame Area. */
220     uint32_t ru_base;           /* RU base address */
221     uint32_t ru_offset;         /* RU address offset */
222     uint32_t statsaddr;         /* pointer to eepro100_stats_t */
223     eepro100_stats_t statistics;        /* statistical counters */
224 #if 0
225     uint16_t status;
226 #endif
227
228     /* Configuration bytes. */
229     uint8_t configuration[22];
230
231     /* Data in mem is always in the byte order of the controller (le). */
232     uint8_t mem[PCI_MEM_SIZE];
233 } EEPRO100State;
234
235 /* Default values for MDI (PHY) registers */
236 static const uint16_t eepro100_mdi_default[] = {
237     /* MDI Registers 0 - 6, 7 */
238     0x3000, 0x780d, 0x02a8, 0x0154, 0x05e1, 0x0000, 0x0000, 0x0000,
239     /* MDI Registers 8 - 15 */
240     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
241     /* MDI Registers 16 - 31 */
242     0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
243     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
244 };
245
246 /* Readonly mask for MDI (PHY) registers */
247 static const uint16_t eepro100_mdi_mask[] = {
248     0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
249     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
250     0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
251     0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
252 };
253
254 #define POLYNOMIAL 0x04c11db6
255
256 /* From FreeBSD */
257 /* XXX: optimize */
258 static int compute_mcast_idx(const uint8_t * ep)
259 {
260     uint32_t crc;
261     int carry, i, j;
262     uint8_t b;
263
264     crc = 0xffffffff;
265     for (i = 0; i < 6; i++) {
266         b = *ep++;
267         for (j = 0; j < 8; j++) {
268             carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
269             crc <<= 1;
270             b >>= 1;
271             if (carry)
272                 crc = ((crc ^ POLYNOMIAL) | carry);
273         }
274     }
275     return (crc >> 26);
276 }
277
278 #if defined(DEBUG_EEPRO100)
279 static const char *nic_dump(const uint8_t * buf, unsigned size)
280 {
281     static char dump[3 * 16 + 1];
282     char *p = &dump[0];
283     if (size > 16)
284         size = 16;
285     while (size-- > 0) {
286         p += sprintf(p, " %02x", *buf++);
287     }
288     return dump;
289 }
290 #endif                          /* DEBUG_EEPRO100 */
291
292 enum scb_stat_ack {
293     stat_ack_not_ours = 0x00,
294     stat_ack_sw_gen = 0x04,
295     stat_ack_rnr = 0x10,
296     stat_ack_cu_idle = 0x20,
297     stat_ack_frame_rx = 0x40,
298     stat_ack_cu_cmd_done = 0x80,
299     stat_ack_not_present = 0xFF,
300     stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
301     stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
302 };
303
304 static void disable_interrupt(EEPRO100State * s)
305 {
306     if (s->int_stat) {
307         logout("interrupt disabled\n");
308         qemu_irq_lower(s->pci_dev->irq[0]);
309         s->int_stat = 0;
310     }
311 }
312
313 static void enable_interrupt(EEPRO100State * s)
314 {
315     if (!s->int_stat) {
316         logout("interrupt enabled\n");
317         qemu_irq_raise(s->pci_dev->irq[0]);
318         s->int_stat = 1;
319     }
320 }
321
322 static void eepro100_acknowledge(EEPRO100State * s)
323 {
324     s->scb_stat &= ~s->mem[SCBAck];
325     s->mem[SCBAck] = s->scb_stat;
326     if (s->scb_stat == 0) {
327         disable_interrupt(s);
328     }
329 }
330
331 static void eepro100_interrupt(EEPRO100State * s, uint8_t stat)
332 {
333     uint8_t mask = ~s->mem[SCBIntmask];
334     s->mem[SCBAck] |= stat;
335     stat = s->scb_stat = s->mem[SCBAck];
336     stat &= (mask | 0x0f);
337     //~ stat &= (~s->mem[SCBIntmask] | 0x0xf);
338     if (stat && (mask & 0x01)) {
339         /* SCB mask and SCB Bit M do not disable interrupt. */
340         enable_interrupt(s);
341     } else if (s->int_stat) {
342         disable_interrupt(s);
343     }
344 }
345
346 static void eepro100_cx_interrupt(EEPRO100State * s)
347 {
348     /* CU completed action command. */
349     /* Transmit not ok (82557 only, not in emulation). */
350     eepro100_interrupt(s, 0x80);
351 }
352
353 static void eepro100_cna_interrupt(EEPRO100State * s)
354 {
355     /* CU left the active state. */
356     eepro100_interrupt(s, 0x20);
357 }
358
359 static void eepro100_fr_interrupt(EEPRO100State * s)
360 {
361     /* RU received a complete frame. */
362     eepro100_interrupt(s, 0x40);
363 }
364
365 #if 0
366 static void eepro100_rnr_interrupt(EEPRO100State * s)
367 {
368     /* RU is not ready. */
369     eepro100_interrupt(s, 0x10);
370 }
371 #endif
372
373 static void eepro100_mdi_interrupt(EEPRO100State * s)
374 {
375     /* MDI completed read or write cycle. */
376     eepro100_interrupt(s, 0x08);
377 }
378
379 static void eepro100_swi_interrupt(EEPRO100State * s)
380 {
381     /* Software has requested an interrupt. */
382     eepro100_interrupt(s, 0x04);
383 }
384
385 #if 0
386 static void eepro100_fcp_interrupt(EEPRO100State * s)
387 {
388     /* Flow control pause interrupt (82558 and later). */
389     eepro100_interrupt(s, 0x01);
390 }
391 #endif
392
393 static void pci_reset(EEPRO100State * s)
394 {
395     uint32_t device = s->device;
396     uint8_t *pci_conf = s->pci_dev->config;
397
398     logout("%p\n", s);
399
400     /* PCI Vendor ID */
401     pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
402     /* PCI Device ID */
403     pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82551IT);
404     /* PCI Command */
405     PCI_CONFIG_16(PCI_COMMAND, 0x0000);
406     /* PCI Status */
407     PCI_CONFIG_16(PCI_STATUS, 0x2800);
408     /* PCI Revision ID */
409     PCI_CONFIG_8(PCI_REVISION_ID, 0x08);
410     /* PCI Class Code */
411     PCI_CONFIG_8(0x09, 0x00);
412     pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
413     /* PCI Cache Line Size */
414     /* check cache line size!!! */
415     //~ PCI_CONFIG_8(0x0c, 0x00);
416     /* PCI Latency Timer */
417     PCI_CONFIG_8(0x0d, 0x20);   // latency timer = 32 clocks
418     /* PCI Header Type */
419     /* BIST (built-in self test) */
420 #if defined(TARGET_I386)
421 // !!! workaround for buggy bios
422 //~ #define PCI_ADDRESS_SPACE_MEM_PREFETCH 0
423 #endif
424 #if 0
425     /* PCI Base Address Registers */
426     /* CSR Memory Mapped Base Address */
427     PCI_CONFIG_32(PCI_BASE_ADDRESS_0,
428                   PCI_ADDRESS_SPACE_MEM | PCI_ADDRESS_SPACE_MEM_PREFETCH);
429     /* CSR I/O Mapped Base Address */
430     PCI_CONFIG_32(PCI_BASE_ADDRESS_1, PCI_ADDRESS_SPACE_IO);
431 #if 0
432     /* Flash Memory Mapped Base Address */
433     PCI_CONFIG_32(PCI_BASE_ADDRESS_2, 0xfffe0000 | PCI_ADDRESS_SPACE_MEM);
434 #endif
435 #endif
436     /* Expansion ROM Base Address (depends on boot disable!!!) */
437     PCI_CONFIG_32(0x30, 0x00000000);
438     /* Capability Pointer */
439     PCI_CONFIG_8(0x34, 0xdc);
440     /* Interrupt Pin */
441     PCI_CONFIG_8(0x3d, 1);      // interrupt pin 0
442     /* Minimum Grant */
443     PCI_CONFIG_8(0x3e, 0x08);
444     /* Maximum Latency */
445     PCI_CONFIG_8(0x3f, 0x18);
446     /* Power Management Capabilities / Next Item Pointer / Capability ID */
447     PCI_CONFIG_32(0xdc, 0x7e210001);
448
449     switch (device) {
450     case i82551:
451         //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1209);
452         PCI_CONFIG_8(PCI_REVISION_ID, 0x0f);
453         break;
454     case i82557B:
455         PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
456         PCI_CONFIG_8(PCI_REVISION_ID, 0x02);
457         break;
458     case i82557C:
459         PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
460         PCI_CONFIG_8(PCI_REVISION_ID, 0x03);
461         break;
462     case i82558B:
463         PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
464         PCI_CONFIG_16(PCI_STATUS, 0x2810);
465         PCI_CONFIG_8(PCI_REVISION_ID, 0x05);
466         break;
467     case i82559C:
468         PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
469         PCI_CONFIG_16(PCI_STATUS, 0x2810);
470         //~ PCI_CONFIG_8(PCI_REVISION_ID, 0x08);
471         break;
472     case i82559ER:
473         //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1209);
474         PCI_CONFIG_16(PCI_STATUS, 0x2810);
475         PCI_CONFIG_8(PCI_REVISION_ID, 0x09);
476         break;
477     //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1029);
478     //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1030);       /* 82559 InBusiness 10/100 */
479     default:
480         logout("Device %X is undefined!\n", device);
481     }
482
483     if (device == i82557C || device == i82558B || device == i82559C) {
484         logout("Get device id and revision from EEPROM!!!\n");
485     }
486 }
487
488 static void nic_selective_reset(EEPRO100State * s)
489 {
490     size_t i;
491     uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
492     //~ eeprom93xx_reset(s->eeprom);
493     memcpy(eeprom_contents, s->macaddr, 6);
494     eeprom_contents[0xa] = 0x4000;
495     uint16_t sum = 0;
496     for (i = 0; i < EEPROM_SIZE - 1; i++) {
497         sum += eeprom_contents[i];
498     }
499     eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum;
500
501     memset(s->mem, 0, sizeof(s->mem));
502     uint32_t val = BIT(21);
503     memcpy(&s->mem[SCBCtrlMDI], &val, sizeof(val));
504
505     assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default));
506     memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem));
507 }
508
509 static void nic_reset(void *opaque)
510 {
511     EEPRO100State *s = (EEPRO100State *) opaque;
512     logout("%p\n", s);
513     static int first;
514     if (!first) {
515         first = 1;
516     }
517     nic_selective_reset(s);
518 }
519
520 #if defined(DEBUG_EEPRO100)
521 static const char *reg[PCI_IO_SIZE / 4] = {
522     "Command/Status",
523     "General Pointer",
524     "Port",
525     "EEPROM/Flash Control",
526     "MDI Control",
527     "Receive DMA Byte Count",
528     "Flow control register",
529     "General Status/Control"
530 };
531
532 static char *regname(uint32_t addr)
533 {
534     static char buf[16];
535     if (addr < PCI_IO_SIZE) {
536         const char *r = reg[addr / 4];
537         if (r != 0) {
538             sprintf(buf, "%s+%u", r, addr % 4);
539         } else {
540             sprintf(buf, "0x%02x", addr);
541         }
542     } else {
543         sprintf(buf, "??? 0x%08x", addr);
544     }
545     return buf;
546 }
547 #endif                          /* DEBUG_EEPRO100 */
548
549 #if 0
550 static uint16_t eepro100_read_status(EEPRO100State * s)
551 {
552     uint16_t val = s->status;
553     logout("val=0x%04x\n", val);
554     return val;
555 }
556
557 static void eepro100_write_status(EEPRO100State * s, uint16_t val)
558 {
559     logout("val=0x%04x\n", val);
560     s->status = val;
561 }
562 #endif
563
564 /*****************************************************************************
565  *
566  * Command emulation.
567  *
568  ****************************************************************************/
569
570 #if 0
571 static uint16_t eepro100_read_command(EEPRO100State * s)
572 {
573     uint16_t val = 0xffff;
574     //~ logout("val=0x%04x\n", val);
575     return val;
576 }
577 #endif
578
579 /* Commands that can be put in a command list entry. */
580 enum commands {
581     CmdNOp = 0,
582     CmdIASetup = 1,
583     CmdConfigure = 2,
584     CmdMulticastList = 3,
585     CmdTx = 4,
586     CmdTDR = 5,                 /* load microcode */
587     CmdDump = 6,
588     CmdDiagnose = 7,
589
590     /* And some extra flags: */
591     CmdSuspend = 0x4000,        /* Suspend after completion. */
592     CmdIntr = 0x2000,           /* Interrupt after completion. */
593     CmdTxFlex = 0x0008,         /* Use "Flexible mode" for CmdTx command. */
594 };
595
596 static cu_state_t get_cu_state(EEPRO100State * s)
597 {
598     return ((s->mem[SCBStatus] >> 6) & 0x03);
599 }
600
601 static void set_cu_state(EEPRO100State * s, cu_state_t state)
602 {
603     s->mem[SCBStatus] = (s->mem[SCBStatus] & 0x3f) + (state << 6);
604 }
605
606 static ru_state_t get_ru_state(EEPRO100State * s)
607 {
608     return ((s->mem[SCBStatus] >> 2) & 0x0f);
609 }
610
611 static void set_ru_state(EEPRO100State * s, ru_state_t state)
612 {
613     s->mem[SCBStatus] = (s->mem[SCBStatus] & 0xc3) + (state << 2);
614 }
615
616 static void dump_statistics(EEPRO100State * s)
617 {
618     /* Dump statistical data. Most data is never changed by the emulation
619      * and always 0, so we first just copy the whole block and then those
620      * values which really matter.
621      * Number of data should check configuration!!!
622      */
623     cpu_physical_memory_write(s->statsaddr, (uint8_t *) & s->statistics, 64);
624     stl_phys(s->statsaddr + 0, s->statistics.tx_good_frames);
625     stl_phys(s->statsaddr + 36, s->statistics.rx_good_frames);
626     stl_phys(s->statsaddr + 48, s->statistics.rx_resource_errors);
627     stl_phys(s->statsaddr + 60, s->statistics.rx_short_frame_errors);
628     //~ stw_phys(s->statsaddr + 76, s->statistics.xmt_tco_frames);
629     //~ stw_phys(s->statsaddr + 78, s->statistics.rcv_tco_frames);
630     //~ missing("CU dump statistical counters");
631 }
632
633 static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
634 {
635     eepro100_tx_t tx;
636     uint32_t cb_address;
637     switch (val) {
638     case CU_NOP:
639         /* No operation. */
640         break;
641     case CU_START:
642         if (get_cu_state(s) != cu_idle) {
643             /* Intel documentation says that CU must be idle for the CU
644              * start command. Intel driver for Linux also starts the CU
645              * from suspended state. */
646             logout("CU state is %u, should be %u\n", get_cu_state(s), cu_idle);
647             //~ assert(!"wrong CU state");
648         }
649         set_cu_state(s, cu_active);
650         s->cu_offset = s->pointer;
651       next_command:
652         cb_address = s->cu_base + s->cu_offset;
653         cpu_physical_memory_read(cb_address, (uint8_t *) & tx, sizeof(tx));
654         uint16_t status = le16_to_cpu(tx.status);
655         uint16_t command = le16_to_cpu(tx.command);
656         logout
657             ("val=0x%02x (cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
658              val, status, command, tx.link);
659         bool bit_el = ((command & 0x8000) != 0);
660         bool bit_s = ((command & 0x4000) != 0);
661         bool bit_i = ((command & 0x2000) != 0);
662         bool bit_nc = ((command & 0x0010) != 0);
663         //~ bool bit_sf = ((command & 0x0008) != 0);
664         uint16_t cmd = command & 0x0007;
665         s->cu_offset = le32_to_cpu(tx.link);
666         switch (cmd) {
667         case CmdNOp:
668             /* Do nothing. */
669             break;
670         case CmdIASetup:
671             cpu_physical_memory_read(cb_address + 8, &s->macaddr[0], 6);
672             logout("macaddr: %s\n", nic_dump(&s->macaddr[0], 6));
673             break;
674         case CmdConfigure:
675             cpu_physical_memory_read(cb_address + 8, &s->configuration[0],
676                                      sizeof(s->configuration));
677             logout("configuration: %s\n", nic_dump(&s->configuration[0], 16));
678             break;
679         case CmdMulticastList:
680             //~ missing("multicast list");
681             break;
682         case CmdTx:
683             (void)0;
684             uint32_t tbd_array = le32_to_cpu(tx.tx_desc_addr);
685             uint16_t tcb_bytes = (le16_to_cpu(tx.tcb_bytes) & 0x3fff);
686             logout
687                 ("transmit, TBD array address 0x%08x, TCB byte count 0x%04x, TBD count %u\n",
688                  tbd_array, tcb_bytes, tx.tbd_count);
689             assert(!bit_nc);
690             //~ assert(!bit_sf);
691             assert(tcb_bytes <= 2600);
692             /* Next assertion fails for local configuration. */
693             //~ assert((tcb_bytes > 0) || (tbd_array != 0xffffffff));
694             if (!((tcb_bytes > 0) || (tbd_array != 0xffffffff))) {
695                 logout
696                     ("illegal values of TBD array address and TCB byte count!\n");
697             }
698             uint8_t buf[MAX_ETH_FRAME_SIZE + 4];
699             uint16_t size = 0;
700             uint32_t tbd_address = cb_address + 0x10;
701             assert(tcb_bytes <= sizeof(buf));
702             while (size < tcb_bytes) {
703                 uint32_t tx_buffer_address = ldl_phys(tbd_address);
704                 uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
705                 //~ uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
706                 tbd_address += 8;
707                 logout
708                     ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
709                      tx_buffer_address, tx_buffer_size);
710                 cpu_physical_memory_read(tx_buffer_address, &buf[size],
711                                          tx_buffer_size);
712                 size += tx_buffer_size;
713             }
714             if (tbd_array == 0xffffffff) {
715                 /* Simplified mode. Was already handled by code above. */
716             } else {
717                 /* Flexible mode. */
718                 uint8_t tbd_count = 0;
719                 if (!(s->configuration[6] & BIT(4))) {
720                     /* Extended TCB. */
721                     assert(tcb_bytes == 0);
722                     for (; tbd_count < 2; tbd_count++) {
723                         uint32_t tx_buffer_address = ldl_phys(tbd_address);
724                         uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
725                         uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
726                         tbd_address += 8;
727                         logout
728                             ("TBD (extended mode): buffer address 0x%08x, size 0x%04x\n",
729                              tx_buffer_address, tx_buffer_size);
730                         cpu_physical_memory_read(tx_buffer_address, &buf[size],
731                                                  tx_buffer_size);
732                         size += tx_buffer_size;
733                         if (tx_buffer_el & 1) {
734                             break;
735                         }
736                     }
737                 }
738                 tbd_address = tbd_array;
739                 for (; tbd_count < tx.tbd_count; tbd_count++) {
740                     uint32_t tx_buffer_address = ldl_phys(tbd_address);
741                     uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
742                     uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
743                     tbd_address += 8;
744                     logout
745                         ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
746                          tx_buffer_address, tx_buffer_size);
747                     cpu_physical_memory_read(tx_buffer_address, &buf[size],
748                                              tx_buffer_size);
749                     size += tx_buffer_size;
750                     if (tx_buffer_el & 1) {
751                         break;
752                     }
753                 }
754             }
755             qemu_send_packet(s->vc, buf, size);
756             s->statistics.tx_good_frames++;
757             /* Transmit with bad status would raise an CX/TNO interrupt.
758              * (82557 only). Emulation never has bad status. */
759             //~ eepro100_cx_interrupt(s);
760             break;
761         case CmdTDR:
762             logout("load microcode\n");
763             /* Starting with offset 8, the command contains
764              * 64 dwords microcode which we just ignore here. */
765             break;
766         default:
767             missing("undefined command");
768         }
769         /* Write new status (success). */
770         stw_phys(cb_address, status | 0x8000 | 0x2000);
771         if (bit_i) {
772             /* CU completed action. */
773             eepro100_cx_interrupt(s);
774         }
775         if (bit_el) {
776             /* CU becomes idle. */
777             set_cu_state(s, cu_idle);
778             eepro100_cna_interrupt(s);
779         } else if (bit_s) {
780             /* CU becomes suspended. */
781             set_cu_state(s, cu_suspended);
782             eepro100_cna_interrupt(s);
783         } else {
784             /* More entries in list. */
785             logout("CU list with at least one more entry\n");
786             goto next_command;
787         }
788         logout("CU list empty\n");
789         /* List is empty. Now CU is idle or suspended. */
790         break;
791     case CU_RESUME:
792         if (get_cu_state(s) != cu_suspended) {
793             logout("bad CU resume from CU state %u\n", get_cu_state(s));
794             /* Workaround for bad Linux eepro100 driver which resumes
795              * from idle state. */
796             //~ missing("cu resume");
797             set_cu_state(s, cu_suspended);
798         }
799         if (get_cu_state(s) == cu_suspended) {
800             logout("CU resuming\n");
801             set_cu_state(s, cu_active);
802             goto next_command;
803         }
804         break;
805     case CU_STATSADDR:
806         /* Load dump counters address. */
807         s->statsaddr = s->pointer;
808         logout("val=0x%02x (status address)\n", val);
809         break;
810     case CU_SHOWSTATS:
811         /* Dump statistical counters. */
812         dump_statistics(s);
813         break;
814     case CU_CMD_BASE:
815         /* Load CU base. */
816         logout("val=0x%02x (CU base address)\n", val);
817         s->cu_base = s->pointer;
818         break;
819     case CU_DUMPSTATS:
820         /* Dump and reset statistical counters. */
821         dump_statistics(s);
822         memset(&s->statistics, 0, sizeof(s->statistics));
823         break;
824     case CU_SRESUME:
825         /* CU static resume. */
826         missing("CU static resume");
827         break;
828     default:
829         missing("Undefined CU command");
830     }
831 }
832
833 static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
834 {
835     switch (val) {
836     case RU_NOP:
837         /* No operation. */
838         break;
839     case RX_START:
840         /* RU start. */
841         if (get_ru_state(s) != ru_idle) {
842             logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
843             //~ assert(!"wrong RU state");
844         }
845         set_ru_state(s, ru_ready);
846         s->ru_offset = s->pointer;
847         logout("val=0x%02x (rx start)\n", val);
848         break;
849     case RX_RESUME:
850         /* Restart RU. */
851         if (get_ru_state(s) != ru_suspended) {
852             logout("RU state is %u, should be %u\n", get_ru_state(s),
853                    ru_suspended);
854             //~ assert(!"wrong RU state");
855         }
856         set_ru_state(s, ru_ready);
857         break;
858     case RX_ADDR_LOAD:
859         /* Load RU base. */
860         logout("val=0x%02x (RU base address)\n", val);
861         s->ru_base = s->pointer;
862         break;
863     default:
864         logout("val=0x%02x (undefined RU command)\n", val);
865         missing("Undefined SU command");
866     }
867 }
868
869 static void eepro100_write_command(EEPRO100State * s, uint8_t val)
870 {
871     eepro100_ru_command(s, val & 0x0f);
872     eepro100_cu_command(s, val & 0xf0);
873     if ((val) == 0) {
874         logout("val=0x%02x\n", val);
875     }
876     /* Clear command byte after command was accepted. */
877     s->mem[SCBCmd] = 0;
878 }
879
880 /*****************************************************************************
881  *
882  * EEPROM emulation.
883  *
884  ****************************************************************************/
885
886 #define EEPROM_CS       0x02
887 #define EEPROM_SK       0x01
888 #define EEPROM_DI       0x04
889 #define EEPROM_DO       0x08
890
891 static uint16_t eepro100_read_eeprom(EEPRO100State * s)
892 {
893     uint16_t val;
894     memcpy(&val, &s->mem[SCBeeprom], sizeof(val));
895     if (eeprom93xx_read(s->eeprom)) {
896         val |= EEPROM_DO;
897     } else {
898         val &= ~EEPROM_DO;
899     }
900     return val;
901 }
902
903 static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
904 {
905     logout("write val=0x%02x\n", val);
906
907     /* mask unwriteable bits */
908     //~ val = SET_MASKED(val, 0x31, eeprom->value);
909
910     int eecs = ((val & EEPROM_CS) != 0);
911     int eesk = ((val & EEPROM_SK) != 0);
912     int eedi = ((val & EEPROM_DI) != 0);
913     eeprom93xx_write(eeprom, eecs, eesk, eedi);
914 }
915
916 static void eepro100_write_pointer(EEPRO100State * s, uint32_t val)
917 {
918     s->pointer = le32_to_cpu(val);
919     logout("val=0x%08x\n", val);
920 }
921
922 /*****************************************************************************
923  *
924  * MDI emulation.
925  *
926  ****************************************************************************/
927
928 #if defined(DEBUG_EEPRO100)
929 static const char *mdi_op_name[] = {
930     "opcode 0",
931     "write",
932     "read",
933     "opcode 3"
934 };
935
936 static const char *mdi_reg_name[] = {
937     "Control",
938     "Status",
939     "PHY Identification (Word 1)",
940     "PHY Identification (Word 2)",
941     "Auto-Negotiation Advertisement",
942     "Auto-Negotiation Link Partner Ability",
943     "Auto-Negotiation Expansion"
944 };
945 #endif                          /* DEBUG_EEPRO100 */
946
947 static uint32_t eepro100_read_mdi(EEPRO100State * s)
948 {
949     uint32_t val;
950     memcpy(&val, &s->mem[0x10], sizeof(val));
951
952 #ifdef DEBUG_EEPRO100
953     uint8_t raiseint = (val & BIT(29)) >> 29;
954     uint8_t opcode = (val & BITS(27, 26)) >> 26;
955     uint8_t phy = (val & BITS(25, 21)) >> 21;
956     uint8_t reg = (val & BITS(20, 16)) >> 16;
957     uint16_t data = (val & BITS(15, 0));
958 #endif
959     /* Emulation takes no time to finish MDI transaction. */
960     val |= BIT(28);
961     TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
962                       val, raiseint, mdi_op_name[opcode], phy,
963                       mdi_reg_name[reg], data));
964     return val;
965 }
966
967 //~ #define BITS(val, upper, lower) (val & ???)
968 static void eepro100_write_mdi(EEPRO100State * s, uint32_t val)
969 {
970     uint8_t raiseint = (val & BIT(29)) >> 29;
971     uint8_t opcode = (val & BITS(27, 26)) >> 26;
972     uint8_t phy = (val & BITS(25, 21)) >> 21;
973     uint8_t reg = (val & BITS(20, 16)) >> 16;
974     uint16_t data = (val & BITS(15, 0));
975     if (phy != 1) {
976         /* Unsupported PHY address. */
977         //~ logout("phy must be 1 but is %u\n", phy);
978         data = 0;
979     } else if (opcode != 1 && opcode != 2) {
980         /* Unsupported opcode. */
981         logout("opcode must be 1 or 2 but is %u\n", opcode);
982         data = 0;
983     } else if (reg > 6) {
984         /* Unsupported register. */
985         logout("register must be 0...6 but is %u\n", reg);
986         data = 0;
987     } else {
988         TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
989                           val, raiseint, mdi_op_name[opcode], phy,
990                           mdi_reg_name[reg], data));
991         if (opcode == 1) {
992             /* MDI write */
993             switch (reg) {
994             case 0:            /* Control Register */
995                 if (data & 0x8000) {
996                     /* Reset status and control registers to default. */
997                     s->mdimem[0] = eepro100_mdi_default[0];
998                     s->mdimem[1] = eepro100_mdi_default[1];
999                     data = s->mdimem[reg];
1000                 } else {
1001                     /* Restart Auto Configuration = Normal Operation */
1002                     data &= ~0x0200;
1003                 }
1004                 break;
1005             case 1:            /* Status Register */
1006                 missing("not writable");
1007                 data = s->mdimem[reg];
1008                 break;
1009             case 2:            /* PHY Identification Register (Word 1) */
1010             case 3:            /* PHY Identification Register (Word 2) */
1011                 missing("not implemented");
1012                 break;
1013             case 4:            /* Auto-Negotiation Advertisement Register */
1014             case 5:            /* Auto-Negotiation Link Partner Ability Register */
1015                 break;
1016             case 6:            /* Auto-Negotiation Expansion Register */
1017             default:
1018                 missing("not implemented");
1019             }
1020             s->mdimem[reg] = data;
1021         } else if (opcode == 2) {
1022             /* MDI read */
1023             switch (reg) {
1024             case 0:            /* Control Register */
1025                 if (data & 0x8000) {
1026                     /* Reset status and control registers to default. */
1027                     s->mdimem[0] = eepro100_mdi_default[0];
1028                     s->mdimem[1] = eepro100_mdi_default[1];
1029                 }
1030                 break;
1031             case 1:            /* Status Register */
1032                 s->mdimem[reg] |= 0x0020;
1033                 break;
1034             case 2:            /* PHY Identification Register (Word 1) */
1035             case 3:            /* PHY Identification Register (Word 2) */
1036             case 4:            /* Auto-Negotiation Advertisement Register */
1037                 break;
1038             case 5:            /* Auto-Negotiation Link Partner Ability Register */
1039                 s->mdimem[reg] = 0x41fe;
1040                 break;
1041             case 6:            /* Auto-Negotiation Expansion Register */
1042                 s->mdimem[reg] = 0x0001;
1043                 break;
1044             }
1045             data = s->mdimem[reg];
1046         }
1047         /* Emulation takes no time to finish MDI transaction.
1048          * Set MDI bit in SCB status register. */
1049         s->mem[SCBAck] |= 0x08;
1050         val |= BIT(28);
1051         if (raiseint) {
1052             eepro100_mdi_interrupt(s);
1053         }
1054     }
1055     val = (val & 0xffff0000) + data;
1056     memcpy(&s->mem[0x10], &val, sizeof(val));
1057 }
1058
1059 /*****************************************************************************
1060  *
1061  * Port emulation.
1062  *
1063  ****************************************************************************/
1064
1065 #define PORT_SOFTWARE_RESET     0
1066 #define PORT_SELFTEST           1
1067 #define PORT_SELECTIVE_RESET    2
1068 #define PORT_DUMP               3
1069 #define PORT_SELECTION_MASK     3
1070
1071 typedef struct {
1072     uint32_t st_sign;           /* Self Test Signature */
1073     uint32_t st_result;         /* Self Test Results */
1074 } eepro100_selftest_t;
1075
1076 static uint32_t eepro100_read_port(EEPRO100State * s)
1077 {
1078     return 0;
1079 }
1080
1081 static void eepro100_write_port(EEPRO100State * s, uint32_t val)
1082 {
1083     val = le32_to_cpu(val);
1084     uint32_t address = (val & ~PORT_SELECTION_MASK);
1085     uint8_t selection = (val & PORT_SELECTION_MASK);
1086     switch (selection) {
1087     case PORT_SOFTWARE_RESET:
1088         nic_reset(s);
1089         break;
1090     case PORT_SELFTEST:
1091         logout("selftest address=0x%08x\n", address);
1092         eepro100_selftest_t data;
1093         cpu_physical_memory_read(address, (uint8_t *) & data, sizeof(data));
1094         data.st_sign = 0xffffffff;
1095         data.st_result = 0;
1096         cpu_physical_memory_write(address, (uint8_t *) & data, sizeof(data));
1097         break;
1098     case PORT_SELECTIVE_RESET:
1099         logout("selective reset, selftest address=0x%08x\n", address);
1100         nic_selective_reset(s);
1101         break;
1102     default:
1103         logout("val=0x%08x\n", val);
1104         missing("unknown port selection");
1105     }
1106 }
1107
1108 /*****************************************************************************
1109  *
1110  * General hardware emulation.
1111  *
1112  ****************************************************************************/
1113
1114 static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
1115 {
1116     uint8_t val;
1117     if (addr <= sizeof(s->mem) - sizeof(val)) {
1118         memcpy(&val, &s->mem[addr], sizeof(val));
1119     }
1120
1121     switch (addr) {
1122     case SCBStatus:
1123         //~ val = eepro100_read_status(s);
1124         logout("addr=%s val=0x%02x\n", regname(addr), val);
1125         break;
1126     case SCBAck:
1127         //~ val = eepro100_read_status(s);
1128         logout("addr=%s val=0x%02x\n", regname(addr), val);
1129         break;
1130     case SCBCmd:
1131         logout("addr=%s val=0x%02x\n", regname(addr), val);
1132         //~ val = eepro100_read_command(s);
1133         break;
1134     case SCBIntmask:
1135         logout("addr=%s val=0x%02x\n", regname(addr), val);
1136         break;
1137     case SCBPort + 3:
1138         logout("addr=%s val=0x%02x\n", regname(addr), val);
1139         break;
1140     case SCBeeprom:
1141         val = eepro100_read_eeprom(s);
1142         break;
1143     case 0x1b:                 /* PMDR (power management driver register) */
1144         val = 0;
1145         logout("addr=%s val=0x%02x\n", regname(addr), val);
1146         break;
1147     case 0x1d:                 /* general status register */
1148         /* 100 Mbps full duplex, valid link */
1149         val = 0x07;
1150         logout("addr=General Status val=%02x\n", val);
1151         break;
1152     default:
1153         logout("addr=%s val=0x%02x\n", regname(addr), val);
1154         missing("unknown byte read");
1155     }
1156     return val;
1157 }
1158
1159 static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
1160 {
1161     uint16_t val;
1162     if (addr <= sizeof(s->mem) - sizeof(val)) {
1163         memcpy(&val, &s->mem[addr], sizeof(val));
1164     }
1165
1166     logout("addr=%s val=0x%04x\n", regname(addr), val);
1167
1168     switch (addr) {
1169     case SCBStatus:
1170         //~ val = eepro100_read_status(s);
1171         break;
1172     case SCBeeprom:
1173         val = eepro100_read_eeprom(s);
1174         break;
1175     default:
1176         logout("addr=%s val=0x%04x\n", regname(addr), val);
1177         missing("unknown word read");
1178     }
1179     return val;
1180 }
1181
1182 static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
1183 {
1184     uint32_t val;
1185     if (addr <= sizeof(s->mem) - sizeof(val)) {
1186         memcpy(&val, &s->mem[addr], sizeof(val));
1187     }
1188
1189     switch (addr) {
1190     case SCBStatus:
1191         //~ val = eepro100_read_status(s);
1192         logout("addr=%s val=0x%08x\n", regname(addr), val);
1193         break;
1194     case SCBPointer:
1195         //~ val = eepro100_read_pointer(s);
1196         logout("addr=%s val=0x%08x\n", regname(addr), val);
1197         break;
1198     case SCBPort:
1199         val = eepro100_read_port(s);
1200         logout("addr=%s val=0x%08x\n", regname(addr), val);
1201         break;
1202     case SCBCtrlMDI:
1203         val = eepro100_read_mdi(s);
1204         break;
1205     default:
1206         logout("addr=%s val=0x%08x\n", regname(addr), val);
1207         missing("unknown longword read");
1208     }
1209     return val;
1210 }
1211
1212 static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
1213 {
1214     if (addr <= sizeof(s->mem) - sizeof(val)) {
1215         memcpy(&s->mem[addr], &val, sizeof(val));
1216     }
1217
1218     logout("addr=%s val=0x%02x\n", regname(addr), val);
1219
1220     switch (addr) {
1221     case SCBStatus:
1222         //~ eepro100_write_status(s, val);
1223         break;
1224     case SCBAck:
1225         eepro100_acknowledge(s);
1226         break;
1227     case SCBCmd:
1228         eepro100_write_command(s, val);
1229         break;
1230     case SCBIntmask:
1231         if (val & BIT(1)) {
1232             eepro100_swi_interrupt(s);
1233         }
1234         eepro100_interrupt(s, 0);
1235         break;
1236     case SCBPort + 3:
1237     case SCBFlow:
1238     case SCBFlow + 1:
1239     case SCBFlow + 2:
1240     case SCBFlow + 3:
1241         logout("addr=%s val=0x%02x\n", regname(addr), val);
1242         break;
1243     case SCBeeprom:
1244         eepro100_write_eeprom(s->eeprom, val);
1245         break;
1246     default:
1247         logout("addr=%s val=0x%02x\n", regname(addr), val);
1248         missing("unknown byte write");
1249     }
1250 }
1251
1252 static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
1253 {
1254     if (addr <= sizeof(s->mem) - sizeof(val)) {
1255         memcpy(&s->mem[addr], &val, sizeof(val));
1256     }
1257
1258     logout("addr=%s val=0x%04x\n", regname(addr), val);
1259
1260     switch (addr) {
1261     case SCBStatus:
1262         //~ eepro100_write_status(s, val);
1263         eepro100_acknowledge(s);
1264         break;
1265     case SCBCmd:
1266         eepro100_write_command(s, val);
1267         eepro100_write1(s, SCBIntmask, val >> 8);
1268         break;
1269     case SCBeeprom:
1270         eepro100_write_eeprom(s->eeprom, val);
1271         break;
1272     default:
1273         logout("addr=%s val=0x%04x\n", regname(addr), val);
1274         missing("unknown word write");
1275     }
1276 }
1277
1278 static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
1279 {
1280     if (addr <= sizeof(s->mem) - sizeof(val)) {
1281         memcpy(&s->mem[addr], &val, sizeof(val));
1282     }
1283
1284     switch (addr) {
1285     case SCBPointer:
1286         eepro100_write_pointer(s, val);
1287         break;
1288     case SCBPort:
1289         logout("addr=%s val=0x%08x\n", regname(addr), val);
1290         eepro100_write_port(s, val);
1291         break;
1292     case SCBCtrlMDI:
1293         eepro100_write_mdi(s, val);
1294         break;
1295     default:
1296         logout("addr=%s val=0x%08x\n", regname(addr), val);
1297         missing("unknown longword write");
1298     }
1299 }
1300
1301 static uint32_t ioport_read1(void *opaque, uint32_t addr)
1302 {
1303     EEPRO100State *s = opaque;
1304     //~ logout("addr=%s\n", regname(addr));
1305     return eepro100_read1(s, addr - s->region[1]);
1306 }
1307
1308 static uint32_t ioport_read2(void *opaque, uint32_t addr)
1309 {
1310     EEPRO100State *s = opaque;
1311     return eepro100_read2(s, addr - s->region[1]);
1312 }
1313
1314 static uint32_t ioport_read4(void *opaque, uint32_t addr)
1315 {
1316     EEPRO100State *s = opaque;
1317     return eepro100_read4(s, addr - s->region[1]);
1318 }
1319
1320 static void ioport_write1(void *opaque, uint32_t addr, uint32_t val)
1321 {
1322     EEPRO100State *s = opaque;
1323     //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1324     eepro100_write1(s, addr - s->region[1], val);
1325 }
1326
1327 static void ioport_write2(void *opaque, uint32_t addr, uint32_t val)
1328 {
1329     EEPRO100State *s = opaque;
1330     eepro100_write2(s, addr - s->region[1], val);
1331 }
1332
1333 static void ioport_write4(void *opaque, uint32_t addr, uint32_t val)
1334 {
1335     EEPRO100State *s = opaque;
1336     eepro100_write4(s, addr - s->region[1], val);
1337 }
1338
1339 /***********************************************************/
1340 /* PCI EEPRO100 definitions */
1341
1342 typedef struct PCIEEPRO100State {
1343     PCIDevice dev;
1344     EEPRO100State eepro100;
1345 } PCIEEPRO100State;
1346
1347 static void pci_map(PCIDevice * pci_dev, int region_num,
1348                     uint32_t addr, uint32_t size, int type)
1349 {
1350     PCIEEPRO100State *d = (PCIEEPRO100State *) pci_dev;
1351     EEPRO100State *s = &d->eepro100;
1352
1353     logout("region %d, addr=0x%08x, size=0x%08x, type=%d\n",
1354            region_num, addr, size, type);
1355
1356     assert(region_num == 1);
1357     register_ioport_write(addr, size, 1, ioport_write1, s);
1358     register_ioport_read(addr, size, 1, ioport_read1, s);
1359     register_ioport_write(addr, size, 2, ioport_write2, s);
1360     register_ioport_read(addr, size, 2, ioport_read2, s);
1361     register_ioport_write(addr, size, 4, ioport_write4, s);
1362     register_ioport_read(addr, size, 4, ioport_read4, s);
1363
1364     s->region[region_num] = addr;
1365 }
1366
1367 static void pci_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1368 {
1369     EEPRO100State *s = opaque;
1370     //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1371     eepro100_write1(s, addr, val);
1372 }
1373
1374 static void pci_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1375 {
1376     EEPRO100State *s = opaque;
1377     //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1378     eepro100_write2(s, addr, val);
1379 }
1380
1381 static void pci_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
1382 {
1383     EEPRO100State *s = opaque;
1384     //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1385     eepro100_write4(s, addr, val);
1386 }
1387
1388 static uint32_t pci_mmio_readb(void *opaque, target_phys_addr_t addr)
1389 {
1390     EEPRO100State *s = opaque;
1391     //~ logout("addr=%s\n", regname(addr));
1392     return eepro100_read1(s, addr);
1393 }
1394
1395 static uint32_t pci_mmio_readw(void *opaque, target_phys_addr_t addr)
1396 {
1397     EEPRO100State *s = opaque;
1398     //~ logout("addr=%s\n", regname(addr));
1399     return eepro100_read2(s, addr);
1400 }
1401
1402 static uint32_t pci_mmio_readl(void *opaque, target_phys_addr_t addr)
1403 {
1404     EEPRO100State *s = opaque;
1405     //~ logout("addr=%s\n", regname(addr));
1406     return eepro100_read4(s, addr);
1407 }
1408
1409 static CPUWriteMemoryFunc *pci_mmio_write[] = {
1410     pci_mmio_writeb,
1411     pci_mmio_writew,
1412     pci_mmio_writel
1413 };
1414
1415 static CPUReadMemoryFunc *pci_mmio_read[] = {
1416     pci_mmio_readb,
1417     pci_mmio_readw,
1418     pci_mmio_readl
1419 };
1420
1421 static void pci_mmio_map(PCIDevice * pci_dev, int region_num,
1422                          uint32_t addr, uint32_t size, int type)
1423 {
1424     PCIEEPRO100State *d = (PCIEEPRO100State *) pci_dev;
1425
1426     logout("region %d, addr=0x%08x, size=0x%08x, type=%d\n",
1427            region_num, addr, size, type);
1428
1429     if (region_num == 0) {
1430         /* Map control / status registers. */
1431         cpu_register_physical_memory(addr, size, d->eepro100.mmio_index);
1432         d->eepro100.region[region_num] = addr;
1433     }
1434 }
1435
1436 static int nic_can_receive(void *opaque)
1437 {
1438     EEPRO100State *s = opaque;
1439     logout("%p\n", s);
1440     return get_ru_state(s) == ru_ready;
1441     //~ return !eepro100_buffer_full(s);
1442 }
1443
1444 static void nic_receive(void *opaque, const uint8_t * buf, int size)
1445 {
1446     /* TODO:
1447      * - Magic packets should set bit 30 in power management driver register.
1448      * - Interesting packets should set bit 29 in power management driver register.
1449      */
1450     EEPRO100State *s = opaque;
1451     uint16_t rfd_status = 0xa000;
1452     static const uint8_t broadcast_macaddr[6] =
1453         { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1454
1455     /* TODO: check multiple IA bit. */
1456     assert(!(s->configuration[20] & BIT(6)));
1457
1458     if (s->configuration[8] & 0x80) {
1459         /* CSMA is disabled. */
1460         logout("%p received while CSMA is disabled\n", s);
1461         return;
1462     } else if (size < 64 && (s->configuration[7] & 1)) {
1463         /* Short frame and configuration byte 7/0 (discard short receive) set:
1464          * Short frame is discarded */
1465         logout("%p received short frame (%d byte)\n", s, size);
1466         s->statistics.rx_short_frame_errors++;
1467         //~ return;
1468     } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & 8)) {
1469         /* Long frame and configuration byte 18/3 (long receive ok) not set:
1470          * Long frames are discarded. */
1471         logout("%p received long frame (%d byte), ignored\n", s, size);
1472         return;
1473     } else if (memcmp(buf, s->macaddr, 6) == 0) {       // !!!
1474         /* Frame matches individual address. */
1475         /* TODO: check configuration byte 15/4 (ignore U/L). */
1476         logout("%p received frame for me, len=%d\n", s, size);
1477     } else if (memcmp(buf, broadcast_macaddr, 6) == 0) {
1478         /* Broadcast frame. */
1479         logout("%p received broadcast, len=%d\n", s, size);
1480         rfd_status |= 0x0002;
1481     } else if (buf[0] & 0x01) { // !!!
1482         /* Multicast frame. */
1483         logout("%p received multicast, len=%d\n", s, size);
1484         /* TODO: check multicast all bit. */
1485         assert(!(s->configuration[21] & BIT(3)));
1486         int mcast_idx = compute_mcast_idx(buf);
1487         if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7)))) {
1488             return;
1489         }
1490         rfd_status |= 0x0002;
1491     } else if (s->configuration[15] & 1) {
1492         /* Promiscuous: receive all. */
1493         logout("%p received frame in promiscuous mode, len=%d\n", s, size);
1494         rfd_status |= 0x0004;
1495     } else {
1496         logout("%p received frame, ignored, len=%d,%s\n", s, size,
1497                nic_dump(buf, size));
1498         return;
1499     }
1500
1501     if (get_ru_state(s) != ru_ready) {
1502         /* No ressources available. */
1503         logout("no ressources, state=%u\n", get_ru_state(s));
1504         s->statistics.rx_resource_errors++;
1505         //~ assert(!"no ressources");
1506         return;
1507     }
1508     //~ !!!
1509 //~ $3 = {status = 0x0, command = 0xc000, link = 0x2d220, rx_buf_addr = 0x207dc, count = 0x0, size = 0x5f8, packet = {0x0 <repeats 1518 times>}}
1510     eepro100_rx_t rx;
1511     cpu_physical_memory_read(s->ru_base + s->ru_offset, (uint8_t *) & rx,
1512                              offsetof(eepro100_rx_t, packet));
1513     uint16_t rfd_command = le16_to_cpu(rx.command);
1514     uint16_t rfd_size = le16_to_cpu(rx.size);
1515     assert(size <= rfd_size);
1516     if (size < 64) {
1517         rfd_status |= 0x0080;
1518     }
1519     logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n", rfd_command,
1520            rx.link, rx.rx_buf_addr, rfd_size);
1521     stw_phys(s->ru_base + s->ru_offset + offsetof(eepro100_rx_t, status),
1522              rfd_status);
1523     stw_phys(s->ru_base + s->ru_offset + offsetof(eepro100_rx_t, count), size);
1524     /* Early receive interrupt not supported. */
1525     //~ eepro100_er_interrupt(s);
1526     /* Receive CRC Transfer not supported. */
1527     assert(!(s->configuration[18] & 4));
1528     /* TODO: check stripping enable bit. */
1529     //~ assert(!(s->configuration[17] & 1));
1530     cpu_physical_memory_write(s->ru_base + s->ru_offset +
1531                               offsetof(eepro100_rx_t, packet), buf, size);
1532     s->statistics.rx_good_frames++;
1533     eepro100_fr_interrupt(s);
1534     s->ru_offset = le32_to_cpu(rx.link);
1535     if (rfd_command & 0x8000) {
1536         /* EL bit is set, so this was the last frame. */
1537         assert(0);
1538     }
1539     if (rfd_command & 0x4000) {
1540         /* S bit is set. */
1541         set_ru_state(s, ru_suspended);
1542     }
1543 }
1544
1545 static int nic_load(QEMUFile * f, void *opaque, int version_id)
1546 {
1547     EEPRO100State *s = (EEPRO100State *) opaque;
1548     int i;
1549     int ret;
1550
1551     if (version_id > 3)
1552         return -EINVAL;
1553
1554     if (s->pci_dev && version_id >= 3) {
1555         ret = pci_device_load(s->pci_dev, f);
1556         if (ret < 0)
1557             return ret;
1558     }
1559
1560     if (version_id >= 2) {
1561         qemu_get_8s(f, &s->rxcr);
1562     } else {
1563         s->rxcr = 0x0c;
1564     }
1565
1566     qemu_get_8s(f, &s->cmd);
1567     qemu_get_be32s(f, &s->start);
1568     qemu_get_be32s(f, &s->stop);
1569     qemu_get_8s(f, &s->boundary);
1570     qemu_get_8s(f, &s->tsr);
1571     qemu_get_8s(f, &s->tpsr);
1572     qemu_get_be16s(f, &s->tcnt);
1573     qemu_get_be16s(f, &s->rcnt);
1574     qemu_get_be32s(f, &s->rsar);
1575     qemu_get_8s(f, &s->rsr);
1576     qemu_get_8s(f, &s->isr);
1577     qemu_get_8s(f, &s->dcfg);
1578     qemu_get_8s(f, &s->imr);
1579     qemu_get_buffer(f, s->phys, 6);
1580     qemu_get_8s(f, &s->curpag);
1581     qemu_get_buffer(f, s->mult, 8);
1582     qemu_get_buffer(f, s->mem, sizeof(s->mem));
1583
1584     /* Restore all members of struct between scv_stat and mem */
1585     qemu_get_8s(f, &s->scb_stat);
1586     qemu_get_8s(f, &s->int_stat);
1587     for (i = 0; i < 3; i++)
1588         qemu_get_be32s(f, &s->region[i]);
1589     qemu_get_buffer(f, s->macaddr, 6);
1590     for (i = 0; i < 19; i++)
1591         qemu_get_be32s(f, &s->statcounter[i]);
1592     for (i = 0; i < 32; i++)
1593         qemu_get_be16s(f, &s->mdimem[i]);
1594     /* The eeprom should be saved and restored by its own routines */
1595     qemu_get_be32s(f, &s->device);
1596     qemu_get_be32s(f, &s->pointer);
1597     qemu_get_be32s(f, &s->cu_base);
1598     qemu_get_be32s(f, &s->cu_offset);
1599     qemu_get_be32s(f, &s->ru_base);
1600     qemu_get_be32s(f, &s->ru_offset);
1601     qemu_get_be32s(f, &s->statsaddr);
1602     /* Restore epro100_stats_t statistics */
1603     qemu_get_be32s(f, &s->statistics.tx_good_frames);
1604     qemu_get_be32s(f, &s->statistics.tx_max_collisions);
1605     qemu_get_be32s(f, &s->statistics.tx_late_collisions);
1606     qemu_get_be32s(f, &s->statistics.tx_underruns);
1607     qemu_get_be32s(f, &s->statistics.tx_lost_crs);
1608     qemu_get_be32s(f, &s->statistics.tx_deferred);
1609     qemu_get_be32s(f, &s->statistics.tx_single_collisions);
1610     qemu_get_be32s(f, &s->statistics.tx_multiple_collisions);
1611     qemu_get_be32s(f, &s->statistics.tx_total_collisions);
1612     qemu_get_be32s(f, &s->statistics.rx_good_frames);
1613     qemu_get_be32s(f, &s->statistics.rx_crc_errors);
1614     qemu_get_be32s(f, &s->statistics.rx_alignment_errors);
1615     qemu_get_be32s(f, &s->statistics.rx_resource_errors);
1616     qemu_get_be32s(f, &s->statistics.rx_overrun_errors);
1617     qemu_get_be32s(f, &s->statistics.rx_cdt_errors);
1618     qemu_get_be32s(f, &s->statistics.rx_short_frame_errors);
1619     qemu_get_be32s(f, &s->statistics.fc_xmt_pause);
1620     qemu_get_be32s(f, &s->statistics.fc_rcv_pause);
1621     qemu_get_be32s(f, &s->statistics.fc_rcv_unsupported);
1622     qemu_get_be16s(f, &s->statistics.xmt_tco_frames);
1623     qemu_get_be16s(f, &s->statistics.rcv_tco_frames);
1624     qemu_get_be32s(f, &s->statistics.complete);
1625 #if 0
1626     qemu_get_be16s(f, &s->status);
1627 #endif
1628
1629     /* Configuration bytes. */
1630     qemu_get_buffer(f, s->configuration, sizeof(s->configuration));
1631
1632     return 0;
1633 }
1634
1635 static void nic_save(QEMUFile * f, void *opaque)
1636 {
1637     EEPRO100State *s = (EEPRO100State *) opaque;
1638     int i;
1639
1640     if (s->pci_dev)
1641         pci_device_save(s->pci_dev, f);
1642
1643     qemu_put_8s(f, &s->rxcr);
1644
1645     qemu_put_8s(f, &s->cmd);
1646     qemu_put_be32s(f, &s->start);
1647     qemu_put_be32s(f, &s->stop);
1648     qemu_put_8s(f, &s->boundary);
1649     qemu_put_8s(f, &s->tsr);
1650     qemu_put_8s(f, &s->tpsr);
1651     qemu_put_be16s(f, &s->tcnt);
1652     qemu_put_be16s(f, &s->rcnt);
1653     qemu_put_be32s(f, &s->rsar);
1654     qemu_put_8s(f, &s->rsr);
1655     qemu_put_8s(f, &s->isr);
1656     qemu_put_8s(f, &s->dcfg);
1657     qemu_put_8s(f, &s->imr);
1658     qemu_put_buffer(f, s->phys, 6);
1659     qemu_put_8s(f, &s->curpag);
1660     qemu_put_buffer(f, s->mult, 8);
1661     qemu_put_buffer(f, s->mem, sizeof(s->mem));
1662
1663     /* Save all members of struct between scv_stat and mem */
1664     qemu_put_8s(f, &s->scb_stat);
1665     qemu_put_8s(f, &s->int_stat);
1666     for (i = 0; i < 3; i++)
1667         qemu_put_be32s(f, &s->region[i]);
1668     qemu_put_buffer(f, s->macaddr, 6);
1669     for (i = 0; i < 19; i++)
1670         qemu_put_be32s(f, &s->statcounter[i]);
1671     for (i = 0; i < 32; i++)
1672         qemu_put_be16s(f, &s->mdimem[i]);
1673     /* The eeprom should be saved and restored by its own routines */
1674     qemu_put_be32s(f, &s->device);
1675     qemu_put_be32s(f, &s->pointer);
1676     qemu_put_be32s(f, &s->cu_base);
1677     qemu_put_be32s(f, &s->cu_offset);
1678     qemu_put_be32s(f, &s->ru_base);
1679     qemu_put_be32s(f, &s->ru_offset);
1680     qemu_put_be32s(f, &s->statsaddr);
1681     /* Save epro100_stats_t statistics */
1682     qemu_put_be32s(f, &s->statistics.tx_good_frames);
1683     qemu_put_be32s(f, &s->statistics.tx_max_collisions);
1684     qemu_put_be32s(f, &s->statistics.tx_late_collisions);
1685     qemu_put_be32s(f, &s->statistics.tx_underruns);
1686     qemu_put_be32s(f, &s->statistics.tx_lost_crs);
1687     qemu_put_be32s(f, &s->statistics.tx_deferred);
1688     qemu_put_be32s(f, &s->statistics.tx_single_collisions);
1689     qemu_put_be32s(f, &s->statistics.tx_multiple_collisions);
1690     qemu_put_be32s(f, &s->statistics.tx_total_collisions);
1691     qemu_put_be32s(f, &s->statistics.rx_good_frames);
1692     qemu_put_be32s(f, &s->statistics.rx_crc_errors);
1693     qemu_put_be32s(f, &s->statistics.rx_alignment_errors);
1694     qemu_put_be32s(f, &s->statistics.rx_resource_errors);
1695     qemu_put_be32s(f, &s->statistics.rx_overrun_errors);
1696     qemu_put_be32s(f, &s->statistics.rx_cdt_errors);
1697     qemu_put_be32s(f, &s->statistics.rx_short_frame_errors);
1698     qemu_put_be32s(f, &s->statistics.fc_xmt_pause);
1699     qemu_put_be32s(f, &s->statistics.fc_rcv_pause);
1700     qemu_put_be32s(f, &s->statistics.fc_rcv_unsupported);
1701     qemu_put_be16s(f, &s->statistics.xmt_tco_frames);
1702     qemu_put_be16s(f, &s->statistics.rcv_tco_frames);
1703     qemu_put_be32s(f, &s->statistics.complete);
1704 #if 0
1705     qemu_put_be16s(f, &s->status);
1706 #endif
1707
1708     /* Configuration bytes. */
1709     qemu_put_buffer(f, s->configuration, sizeof(s->configuration));
1710 }
1711
1712 static void nic_cleanup(VLANClientState *vc)
1713 {
1714     EEPRO100State *s = vc->opaque;
1715
1716     unregister_savevm(vc->model, s);
1717
1718     eeprom93xx_free(s->eeprom);
1719 }
1720
1721 static int pci_nic_uninit(PCIDevice *dev)
1722 {
1723     PCIEEPRO100State *d = (PCIEEPRO100State *) dev;
1724     EEPRO100State *s = &d->eepro100;
1725
1726     cpu_unregister_io_memory(s->mmio_index);
1727
1728     return 0;
1729 }
1730
1731 static void nic_init(PCIDevice *pci_dev, uint32_t device)
1732 {
1733     PCIEEPRO100State *d = (PCIEEPRO100State *)pci_dev;
1734     EEPRO100State *s;
1735
1736     logout("\n");
1737
1738     d->dev.unregister = pci_nic_uninit;
1739
1740     s = &d->eepro100;
1741     s->device = device;
1742     s->pci_dev = &d->dev;
1743
1744     pci_reset(s);
1745
1746     /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
1747      * i82559 and later support 64 or 256 word EEPROM. */
1748     s->eeprom = eeprom93xx_new(EEPROM_SIZE);
1749
1750     /* Handler for memory-mapped I/O */
1751     d->eepro100.mmio_index =
1752         cpu_register_io_memory(0, pci_mmio_read, pci_mmio_write, s);
1753
1754     pci_register_io_region(&d->dev, 0, PCI_MEM_SIZE,
1755                            PCI_ADDRESS_SPACE_MEM |
1756                            PCI_ADDRESS_SPACE_MEM_PREFETCH, pci_mmio_map);
1757     pci_register_io_region(&d->dev, 1, PCI_IO_SIZE, PCI_ADDRESS_SPACE_IO,
1758                            pci_map);
1759     pci_register_io_region(&d->dev, 2, PCI_FLASH_SIZE, PCI_ADDRESS_SPACE_MEM,
1760                            pci_mmio_map);
1761
1762     qdev_get_macaddr(&d->dev.qdev, s->macaddr);
1763     logout("macaddr: %s\n", nic_dump(&s->macaddr[0], 6));
1764     assert(s->region[1] == 0);
1765
1766     nic_reset(s);
1767
1768     s->vc = qdev_get_vlan_client(&d->dev.qdev,
1769                                  nic_receive, nic_can_receive,
1770                                  nic_cleanup, s);
1771
1772     qemu_format_nic_info_str(s->vc, s->macaddr);
1773
1774     qemu_register_reset(nic_reset, 0, s);
1775
1776     register_savevm(s->vc->model, -1, 3, nic_save, nic_load, s);
1777 }
1778
1779 static void pci_i82551_init(PCIDevice *dev)
1780 {
1781     nic_init(dev, i82551);
1782 }
1783
1784 static void pci_i82557b_init(PCIDevice *dev)
1785 {
1786     nic_init(dev, i82557B);
1787 }
1788
1789 static void pci_i82559er_init(PCIDevice *dev)
1790 {
1791     nic_init(dev, i82559ER);
1792 }
1793
1794 static void eepro100_register_devices(void)
1795 {
1796     pci_qdev_register("i82551", sizeof(PCIEEPRO100State),
1797                       pci_i82551_init);
1798     pci_qdev_register("i82557b", sizeof(PCIEEPRO100State),
1799                       pci_i82557b_init);
1800     pci_qdev_register("i82559er", sizeof(PCIEEPRO100State),
1801                       pci_i82559er_init);
1802 }
1803
1804 device_init(eepro100_register_devices)