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