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