Statistics
| Branch: | Revision:

root / hw / eepro100.c @ 87ecb68b

History | View | Annotate | Download (57.3 kB)

1 663e8e51 ths
/*
2 663e8e51 ths
 * QEMU i8255x (PRO100) emulation
3 663e8e51 ths
 *
4 663e8e51 ths
 * Copyright (c) 2006-2007 Stefan Weil
5 663e8e51 ths
 *
6 663e8e51 ths
 * Portions of the code are copies from grub / etherboot eepro100.c
7 663e8e51 ths
 * and linux e100.c.
8 663e8e51 ths
 *
9 663e8e51 ths
 * This program is free software; you can redistribute it and/or modify
10 663e8e51 ths
 * it under the terms of the GNU General Public License as published by
11 663e8e51 ths
 * the Free Software Foundation; either version 2 of the License, or
12 663e8e51 ths
 * (at your option) any later version.
13 663e8e51 ths
 *
14 663e8e51 ths
 * This program is distributed in the hope that it will be useful,
15 663e8e51 ths
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 663e8e51 ths
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 663e8e51 ths
 * GNU General Public License for more details.
18 663e8e51 ths
 *
19 663e8e51 ths
 * You should have received a copy of the GNU General Public License
20 663e8e51 ths
 * along with this program; if not, write to the Free Software
21 663e8e51 ths
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22 663e8e51 ths
 *
23 663e8e51 ths
 * Tested features (i82559):
24 663e8e51 ths
 *      PXE boot (i386) no valid link
25 663e8e51 ths
 *      Linux networking (i386) ok
26 663e8e51 ths
 *
27 663e8e51 ths
 * Untested:
28 663e8e51 ths
 *      non-i386 platforms
29 663e8e51 ths
 *      Windows networking
30 663e8e51 ths
 *
31 663e8e51 ths
 * References:
32 663e8e51 ths
 *
33 663e8e51 ths
 * Intel 8255x 10/100 Mbps Ethernet Controller Family
34 663e8e51 ths
 * Open Source Software Developer Manual
35 663e8e51 ths
 */
36 663e8e51 ths
37 663e8e51 ths
#if defined(TARGET_I386)
38 663e8e51 ths
# warning "PXE boot still not working!"
39 663e8e51 ths
#endif
40 663e8e51 ths
41 663e8e51 ths
#include <assert.h>
42 663e8e51 ths
#include <stddef.h>             /* offsetof */
43 87ecb68b pbrook
#include "hw.h"
44 87ecb68b pbrook
#include "pci.h"
45 87ecb68b pbrook
#include "net.h"
46 663e8e51 ths
#include "eeprom93xx.h"
47 663e8e51 ths
48 663e8e51 ths
/* Common declarations for all PCI devices. */
49 663e8e51 ths
50 663e8e51 ths
#define PCI_VENDOR_ID           0x00    /* 16 bits */
51 663e8e51 ths
#define PCI_DEVICE_ID           0x02    /* 16 bits */
52 663e8e51 ths
#define PCI_COMMAND             0x04    /* 16 bits */
53 663e8e51 ths
#define PCI_STATUS              0x06    /* 16 bits */
54 663e8e51 ths
55 663e8e51 ths
#define PCI_REVISION_ID         0x08    /* 8 bits  */
56 663e8e51 ths
#define PCI_CLASS_CODE          0x0b    /* 8 bits */
57 663e8e51 ths
#define PCI_SUBCLASS_CODE       0x0a    /* 8 bits */
58 663e8e51 ths
#define PCI_HEADER_TYPE         0x0e    /* 8 bits */
59 663e8e51 ths
60 663e8e51 ths
#define PCI_BASE_ADDRESS_0      0x10    /* 32 bits */
61 663e8e51 ths
#define PCI_BASE_ADDRESS_1      0x14    /* 32 bits */
62 663e8e51 ths
#define PCI_BASE_ADDRESS_2      0x18    /* 32 bits */
63 663e8e51 ths
#define PCI_BASE_ADDRESS_3      0x1c    /* 32 bits */
64 663e8e51 ths
#define PCI_BASE_ADDRESS_4      0x20    /* 32 bits */
65 663e8e51 ths
#define PCI_BASE_ADDRESS_5      0x24    /* 32 bits */
66 663e8e51 ths
67 663e8e51 ths
#define PCI_CONFIG_8(offset, value) \
68 663e8e51 ths
    (pci_conf[offset] = (value))
69 663e8e51 ths
#define PCI_CONFIG_16(offset, value) \
70 663e8e51 ths
    (*(uint16_t *)&pci_conf[offset] = cpu_to_le16(value))
71 663e8e51 ths
#define PCI_CONFIG_32(offset, value) \
72 663e8e51 ths
    (*(uint32_t *)&pci_conf[offset] = cpu_to_le32(value))
73 663e8e51 ths
74 663e8e51 ths
#define KiB 1024
75 663e8e51 ths
76 663e8e51 ths
/* debug EEPRO100 card */
77 663e8e51 ths
//~ #define DEBUG_EEPRO100
78 663e8e51 ths
79 663e8e51 ths
#ifdef DEBUG_EEPRO100
80 663e8e51 ths
#define logout(fmt, args...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ##args)
81 663e8e51 ths
#else
82 663e8e51 ths
#define logout(fmt, args...) ((void)0)
83 663e8e51 ths
#endif
84 663e8e51 ths
85 663e8e51 ths
/* Set flags to 0 to disable debug output. */
86 663e8e51 ths
#define MDI     0
87 663e8e51 ths
88 663e8e51 ths
#define TRACE(flag, command) ((flag) ? (command) : (void)0)
89 663e8e51 ths
90 663e8e51 ths
#define missing(text)       assert(!"feature is missing in this emulation: " text)
91 663e8e51 ths
92 663e8e51 ths
#define MAX_ETH_FRAME_SIZE 1514
93 663e8e51 ths
94 663e8e51 ths
/* This driver supports several different devices which are declared here. */
95 663e8e51 ths
#define i82551          0x82551
96 663e8e51 ths
#define i82557B         0x82557b
97 663e8e51 ths
#define i82557C         0x82557c
98 663e8e51 ths
#define i82558B         0x82558b
99 663e8e51 ths
#define i82559C         0x82559c
100 663e8e51 ths
#define i82559ER        0x82559e
101 663e8e51 ths
#define i82562          0x82562
102 663e8e51 ths
103 663e8e51 ths
#define EEPROM_SIZE     64
104 663e8e51 ths
105 663e8e51 ths
#define PCI_MEM_SIZE            (4 * KiB)
106 663e8e51 ths
#define PCI_IO_SIZE             64
107 663e8e51 ths
#define PCI_FLASH_SIZE          (128 * KiB)
108 663e8e51 ths
109 663e8e51 ths
#define BIT(n) (1 << (n))
110 663e8e51 ths
#define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
111 663e8e51 ths
112 663e8e51 ths
/* The SCB accepts the following controls for the Tx and Rx units: */
113 663e8e51 ths
#define  CU_NOP         0x0000  /* No operation. */
114 663e8e51 ths
#define  CU_START       0x0010  /* CU start. */
115 663e8e51 ths
#define  CU_RESUME      0x0020  /* CU resume. */
116 663e8e51 ths
#define  CU_STATSADDR   0x0040  /* Load dump counters address. */
117 663e8e51 ths
#define  CU_SHOWSTATS   0x0050  /* Dump statistical counters. */
118 663e8e51 ths
#define  CU_CMD_BASE    0x0060  /* Load CU base address. */
119 663e8e51 ths
#define  CU_DUMPSTATS   0x0070  /* Dump and reset statistical counters. */
120 663e8e51 ths
#define  CU_SRESUME     0x00a0  /* CU static resume. */
121 663e8e51 ths
122 663e8e51 ths
#define  RU_NOP         0x0000
123 663e8e51 ths
#define  RX_START       0x0001
124 663e8e51 ths
#define  RX_RESUME      0x0002
125 663e8e51 ths
#define  RX_ABORT       0x0004
126 663e8e51 ths
#define  RX_ADDR_LOAD   0x0006
127 663e8e51 ths
#define  RX_RESUMENR    0x0007
128 663e8e51 ths
#define INT_MASK        0x0100
129 663e8e51 ths
#define DRVR_INT        0x0200  /* Driver generated interrupt. */
130 663e8e51 ths
131 663e8e51 ths
typedef unsigned char bool;
132 663e8e51 ths
133 663e8e51 ths
/* Offsets to the various registers.
134 663e8e51 ths
   All accesses need not be longword aligned. */
135 663e8e51 ths
enum speedo_offsets {
136 663e8e51 ths
    SCBStatus = 0,
137 663e8e51 ths
    SCBAck = 1,
138 663e8e51 ths
    SCBCmd = 2,                 /* Rx/Command Unit command and status. */
139 663e8e51 ths
    SCBIntmask = 3,
140 663e8e51 ths
    SCBPointer = 4,             /* General purpose pointer. */
141 663e8e51 ths
    SCBPort = 8,                /* Misc. commands and operands.  */
142 663e8e51 ths
    SCBflash = 12, SCBeeprom = 14,      /* EEPROM and flash memory control. */
143 663e8e51 ths
    SCBCtrlMDI = 16,            /* MDI interface control. */
144 663e8e51 ths
    SCBEarlyRx = 20,            /* Early receive byte count. */
145 3257d2b6 ths
    SCBFlow = 24,
146 663e8e51 ths
};
147 663e8e51 ths
148 663e8e51 ths
/* A speedo3 transmit buffer descriptor with two buffers... */
149 663e8e51 ths
typedef struct {
150 663e8e51 ths
    uint16_t status;
151 663e8e51 ths
    uint16_t command;
152 663e8e51 ths
    uint32_t link;              /* void * */
153 663e8e51 ths
    uint32_t tx_desc_addr;      /* transmit buffer decsriptor array address. */
154 663e8e51 ths
    uint16_t tcb_bytes;         /* transmit command block byte count (in lower 14 bits */
155 663e8e51 ths
    uint8_t tx_threshold;       /* transmit threshold */
156 663e8e51 ths
    uint8_t tbd_count;          /* TBD number */
157 663e8e51 ths
    //~ /* This constitutes two "TBD" entries: hdr and data */
158 663e8e51 ths
    //~ uint32_t tx_buf_addr0;  /* void *, header of frame to be transmitted.  */
159 663e8e51 ths
    //~ int32_t  tx_buf_size0;  /* Length of Tx hdr. */
160 663e8e51 ths
    //~ uint32_t tx_buf_addr1;  /* void *, data to be transmitted.  */
161 663e8e51 ths
    //~ int32_t  tx_buf_size1;  /* Length of Tx data. */
162 663e8e51 ths
} eepro100_tx_t;
163 663e8e51 ths
164 663e8e51 ths
/* Receive frame descriptor. */
165 663e8e51 ths
typedef struct {
166 663e8e51 ths
    int16_t status;
167 663e8e51 ths
    uint16_t command;
168 663e8e51 ths
    uint32_t link;              /* struct RxFD * */
169 663e8e51 ths
    uint32_t rx_buf_addr;       /* void * */
170 663e8e51 ths
    uint16_t count;
171 663e8e51 ths
    uint16_t size;
172 663e8e51 ths
    char packet[MAX_ETH_FRAME_SIZE + 4];
173 663e8e51 ths
} eepro100_rx_t;
174 663e8e51 ths
175 663e8e51 ths
typedef struct {
176 663e8e51 ths
    uint32_t tx_good_frames, tx_max_collisions, tx_late_collisions,
177 663e8e51 ths
        tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
178 663e8e51 ths
        tx_multiple_collisions, tx_total_collisions;
179 663e8e51 ths
    uint32_t rx_good_frames, rx_crc_errors, rx_alignment_errors,
180 663e8e51 ths
        rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
181 663e8e51 ths
        rx_short_frame_errors;
182 663e8e51 ths
    uint32_t fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
183 663e8e51 ths
    uint16_t xmt_tco_frames, rcv_tco_frames;
184 663e8e51 ths
    uint32_t complete;
185 663e8e51 ths
} eepro100_stats_t;
186 663e8e51 ths
187 663e8e51 ths
typedef enum {
188 663e8e51 ths
    cu_idle = 0,
189 663e8e51 ths
    cu_suspended = 1,
190 663e8e51 ths
    cu_active = 2,
191 663e8e51 ths
    cu_lpq_active = 2,
192 663e8e51 ths
    cu_hqp_active = 3
193 663e8e51 ths
} cu_state_t;
194 663e8e51 ths
195 663e8e51 ths
typedef enum {
196 663e8e51 ths
    ru_idle = 0,
197 663e8e51 ths
    ru_suspended = 1,
198 663e8e51 ths
    ru_no_resources = 2,
199 663e8e51 ths
    ru_ready = 4
200 663e8e51 ths
} ru_state_t;
201 663e8e51 ths
202 663e8e51 ths
#if defined(__BIG_ENDIAN_BITFIELD)
203 663e8e51 ths
#define X(a,b)        b,a
204 663e8e51 ths
#else
205 663e8e51 ths
#define X(a,b)        a,b
206 663e8e51 ths
#endif
207 663e8e51 ths
208 663e8e51 ths
typedef struct {
209 663e8e51 ths
#if 1
210 663e8e51 ths
    uint8_t cmd;
211 663e8e51 ths
    uint32_t start;
212 663e8e51 ths
    uint32_t stop;
213 663e8e51 ths
    uint8_t boundary;
214 663e8e51 ths
    uint8_t tsr;
215 663e8e51 ths
    uint8_t tpsr;
216 663e8e51 ths
    uint16_t tcnt;
217 663e8e51 ths
    uint16_t rcnt;
218 663e8e51 ths
    uint32_t rsar;
219 663e8e51 ths
    uint8_t rsr;
220 663e8e51 ths
    uint8_t rxcr;
221 663e8e51 ths
    uint8_t isr;
222 663e8e51 ths
    uint8_t dcfg;
223 663e8e51 ths
    uint8_t imr;
224 663e8e51 ths
    uint8_t phys[6];            /* mac address */
225 663e8e51 ths
    uint8_t curpag;
226 663e8e51 ths
    uint8_t mult[8];            /* multicast mask array */
227 663e8e51 ths
    int mmio_index;
228 663e8e51 ths
    PCIDevice *pci_dev;
229 663e8e51 ths
    VLANClientState *vc;
230 663e8e51 ths
#endif
231 663e8e51 ths
    uint8_t scb_stat;           /* SCB stat/ack byte */
232 663e8e51 ths
    uint8_t int_stat;           /* PCI interrupt status */
233 663e8e51 ths
    uint32_t region[3];         /* PCI region addresses */
234 663e8e51 ths
    uint8_t macaddr[6];
235 663e8e51 ths
    uint32_t statcounter[19];
236 663e8e51 ths
    uint16_t mdimem[32];
237 663e8e51 ths
    eeprom_t *eeprom;
238 663e8e51 ths
    uint32_t device;            /* device variant */
239 663e8e51 ths
    uint32_t pointer;
240 663e8e51 ths
    /* (cu_base + cu_offset) address the next command block in the command block list. */
241 663e8e51 ths
    uint32_t cu_base;           /* CU base address */
242 663e8e51 ths
    uint32_t cu_offset;         /* CU address offset */
243 663e8e51 ths
    /* (ru_base + ru_offset) address the RFD in the Receive Frame Area. */
244 663e8e51 ths
    uint32_t ru_base;           /* RU base address */
245 663e8e51 ths
    uint32_t ru_offset;         /* RU address offset */
246 663e8e51 ths
    uint32_t statsaddr;         /* pointer to eepro100_stats_t */
247 663e8e51 ths
    eepro100_stats_t statistics;        /* statistical counters */
248 663e8e51 ths
#if 0
249 663e8e51 ths
    uint16_t status;
250 663e8e51 ths
#endif
251 663e8e51 ths
252 663e8e51 ths
    /* Configuration bytes. */
253 663e8e51 ths
    uint8_t configuration[22];
254 663e8e51 ths
255 663e8e51 ths
    /* Data in mem is always in the byte order of the controller (le). */
256 663e8e51 ths
    uint8_t mem[PCI_MEM_SIZE];
257 663e8e51 ths
} EEPRO100State;
258 663e8e51 ths
259 663e8e51 ths
/* Default values for MDI (PHY) registers */
260 663e8e51 ths
static const uint16_t eepro100_mdi_default[] = {
261 663e8e51 ths
    /* MDI Registers 0 - 6, 7 */
262 663e8e51 ths
    0x3000, 0x780d, 0x02a8, 0x0154, 0x05e1, 0x0000, 0x0000, 0x0000,
263 663e8e51 ths
    /* MDI Registers 8 - 15 */
264 663e8e51 ths
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
265 663e8e51 ths
    /* MDI Registers 16 - 31 */
266 663e8e51 ths
    0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
267 663e8e51 ths
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
268 663e8e51 ths
};
269 663e8e51 ths
270 663e8e51 ths
/* Readonly mask for MDI (PHY) registers */
271 663e8e51 ths
static const uint16_t eepro100_mdi_mask[] = {
272 663e8e51 ths
    0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
273 663e8e51 ths
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
274 663e8e51 ths
    0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
275 663e8e51 ths
    0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
276 663e8e51 ths
};
277 663e8e51 ths
278 663e8e51 ths
#define POLYNOMIAL 0x04c11db6
279 663e8e51 ths
280 663e8e51 ths
/* From FreeBSD */
281 663e8e51 ths
/* XXX: optimize */
282 663e8e51 ths
static int compute_mcast_idx(const uint8_t * ep)
283 663e8e51 ths
{
284 663e8e51 ths
    uint32_t crc;
285 663e8e51 ths
    int carry, i, j;
286 663e8e51 ths
    uint8_t b;
287 663e8e51 ths
288 663e8e51 ths
    crc = 0xffffffff;
289 663e8e51 ths
    for (i = 0; i < 6; i++) {
290 663e8e51 ths
        b = *ep++;
291 663e8e51 ths
        for (j = 0; j < 8; j++) {
292 663e8e51 ths
            carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
293 663e8e51 ths
            crc <<= 1;
294 663e8e51 ths
            b >>= 1;
295 663e8e51 ths
            if (carry)
296 663e8e51 ths
                crc = ((crc ^ POLYNOMIAL) | carry);
297 663e8e51 ths
        }
298 663e8e51 ths
    }
299 663e8e51 ths
    return (crc >> 26);
300 663e8e51 ths
}
301 663e8e51 ths
302 663e8e51 ths
#if defined(DEBUG_EEPRO100)
303 663e8e51 ths
static const char *nic_dump(const uint8_t * buf, unsigned size)
304 663e8e51 ths
{
305 663e8e51 ths
    static char dump[3 * 16 + 1];
306 663e8e51 ths
    char *p = &dump[0];
307 663e8e51 ths
    if (size > 16)
308 663e8e51 ths
        size = 16;
309 663e8e51 ths
    while (size-- > 0) {
310 663e8e51 ths
        p += sprintf(p, " %02x", *buf++);
311 663e8e51 ths
    }
312 663e8e51 ths
    return dump;
313 663e8e51 ths
}
314 663e8e51 ths
#endif                          /* DEBUG_EEPRO100 */
315 663e8e51 ths
316 663e8e51 ths
enum scb_stat_ack {
317 663e8e51 ths
    stat_ack_not_ours = 0x00,
318 663e8e51 ths
    stat_ack_sw_gen = 0x04,
319 663e8e51 ths
    stat_ack_rnr = 0x10,
320 663e8e51 ths
    stat_ack_cu_idle = 0x20,
321 663e8e51 ths
    stat_ack_frame_rx = 0x40,
322 663e8e51 ths
    stat_ack_cu_cmd_done = 0x80,
323 663e8e51 ths
    stat_ack_not_present = 0xFF,
324 663e8e51 ths
    stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
325 663e8e51 ths
    stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
326 663e8e51 ths
};
327 663e8e51 ths
328 663e8e51 ths
static void disable_interrupt(EEPRO100State * s)
329 663e8e51 ths
{
330 663e8e51 ths
    if (s->int_stat) {
331 663e8e51 ths
        logout("interrupt disabled\n");
332 d537cf6c pbrook
        qemu_irq_lower(s->pci_dev->irq[0]);
333 663e8e51 ths
        s->int_stat = 0;
334 663e8e51 ths
    }
335 663e8e51 ths
}
336 663e8e51 ths
337 663e8e51 ths
static void enable_interrupt(EEPRO100State * s)
338 663e8e51 ths
{
339 663e8e51 ths
    if (!s->int_stat) {
340 663e8e51 ths
        logout("interrupt enabled\n");
341 d537cf6c pbrook
        qemu_irq_raise(s->pci_dev->irq[0]);
342 663e8e51 ths
        s->int_stat = 1;
343 663e8e51 ths
    }
344 663e8e51 ths
}
345 663e8e51 ths
346 663e8e51 ths
static void eepro100_acknowledge(EEPRO100State * s)
347 663e8e51 ths
{
348 663e8e51 ths
    s->scb_stat &= ~s->mem[SCBAck];
349 663e8e51 ths
    s->mem[SCBAck] = s->scb_stat;
350 663e8e51 ths
    if (s->scb_stat == 0) {
351 663e8e51 ths
        disable_interrupt(s);
352 663e8e51 ths
    }
353 663e8e51 ths
}
354 663e8e51 ths
355 663e8e51 ths
static void eepro100_interrupt(EEPRO100State * s, uint8_t stat)
356 663e8e51 ths
{
357 663e8e51 ths
    uint8_t mask = ~s->mem[SCBIntmask];
358 663e8e51 ths
    s->mem[SCBAck] |= stat;
359 663e8e51 ths
    stat = s->scb_stat = s->mem[SCBAck];
360 663e8e51 ths
    stat &= (mask | 0x0f);
361 663e8e51 ths
    //~ stat &= (~s->mem[SCBIntmask] | 0x0xf);
362 663e8e51 ths
    if (stat && (mask & 0x01)) {
363 663e8e51 ths
        /* SCB mask and SCB Bit M do not disable interrupt. */
364 663e8e51 ths
        enable_interrupt(s);
365 663e8e51 ths
    } else if (s->int_stat) {
366 663e8e51 ths
        disable_interrupt(s);
367 663e8e51 ths
    }
368 663e8e51 ths
}
369 663e8e51 ths
370 663e8e51 ths
static void eepro100_cx_interrupt(EEPRO100State * s)
371 663e8e51 ths
{
372 663e8e51 ths
    /* CU completed action command. */
373 663e8e51 ths
    /* Transmit not ok (82557 only, not in emulation). */
374 663e8e51 ths
    eepro100_interrupt(s, 0x80);
375 663e8e51 ths
}
376 663e8e51 ths
377 663e8e51 ths
static void eepro100_cna_interrupt(EEPRO100State * s)
378 663e8e51 ths
{
379 663e8e51 ths
    /* CU left the active state. */
380 663e8e51 ths
    eepro100_interrupt(s, 0x20);
381 663e8e51 ths
}
382 663e8e51 ths
383 663e8e51 ths
static void eepro100_fr_interrupt(EEPRO100State * s)
384 663e8e51 ths
{
385 663e8e51 ths
    /* RU received a complete frame. */
386 663e8e51 ths
    eepro100_interrupt(s, 0x40);
387 663e8e51 ths
}
388 663e8e51 ths
389 663e8e51 ths
#if 0
390 663e8e51 ths
static void eepro100_rnr_interrupt(EEPRO100State * s)
391 663e8e51 ths
{
392 663e8e51 ths
    /* RU is not ready. */
393 663e8e51 ths
    eepro100_interrupt(s, 0x10);
394 663e8e51 ths
}
395 663e8e51 ths
#endif
396 663e8e51 ths
397 663e8e51 ths
static void eepro100_mdi_interrupt(EEPRO100State * s)
398 663e8e51 ths
{
399 663e8e51 ths
    /* MDI completed read or write cycle. */
400 663e8e51 ths
    eepro100_interrupt(s, 0x08);
401 663e8e51 ths
}
402 663e8e51 ths
403 663e8e51 ths
static void eepro100_swi_interrupt(EEPRO100State * s)
404 663e8e51 ths
{
405 663e8e51 ths
    /* Software has requested an interrupt. */
406 663e8e51 ths
    eepro100_interrupt(s, 0x04);
407 663e8e51 ths
}
408 663e8e51 ths
409 663e8e51 ths
#if 0
410 663e8e51 ths
static void eepro100_fcp_interrupt(EEPRO100State * s)
411 663e8e51 ths
{
412 663e8e51 ths
    /* Flow control pause interrupt (82558 and later). */
413 663e8e51 ths
    eepro100_interrupt(s, 0x01);
414 663e8e51 ths
}
415 663e8e51 ths
#endif
416 663e8e51 ths
417 663e8e51 ths
static void pci_reset(EEPRO100State * s)
418 663e8e51 ths
{
419 663e8e51 ths
    uint32_t device = s->device;
420 663e8e51 ths
    uint8_t *pci_conf = s->pci_dev->config;
421 663e8e51 ths
422 663e8e51 ths
    logout("%p\n", s);
423 663e8e51 ths
424 663e8e51 ths
    /* PCI Vendor ID */
425 663e8e51 ths
    PCI_CONFIG_16(PCI_VENDOR_ID, 0x8086);
426 663e8e51 ths
    /* PCI Device ID */
427 663e8e51 ths
    PCI_CONFIG_16(PCI_DEVICE_ID, 0x1209);
428 663e8e51 ths
    /* PCI Command */
429 663e8e51 ths
    PCI_CONFIG_16(PCI_COMMAND, 0x0000);
430 663e8e51 ths
    /* PCI Status */
431 663e8e51 ths
    PCI_CONFIG_16(PCI_STATUS, 0x2800);
432 663e8e51 ths
    /* PCI Revision ID */
433 663e8e51 ths
    PCI_CONFIG_8(PCI_REVISION_ID, 0x08);
434 663e8e51 ths
    /* PCI Class Code */
435 663e8e51 ths
    PCI_CONFIG_8(0x09, 0x00);
436 663e8e51 ths
    PCI_CONFIG_8(PCI_SUBCLASS_CODE, 0x00);      // ethernet network controller
437 663e8e51 ths
    PCI_CONFIG_8(PCI_CLASS_CODE, 0x02); // network controller
438 663e8e51 ths
    /* PCI Cache Line Size */
439 663e8e51 ths
    /* check cache line size!!! */
440 663e8e51 ths
    //~ PCI_CONFIG_8(0x0c, 0x00);
441 663e8e51 ths
    /* PCI Latency Timer */
442 663e8e51 ths
    PCI_CONFIG_8(0x0d, 0x20);   // latency timer = 32 clocks
443 663e8e51 ths
    /* PCI Header Type */
444 663e8e51 ths
    /* BIST (built-in self test) */
445 663e8e51 ths
#if defined(TARGET_I386)
446 663e8e51 ths
// !!! workaround for buggy bios
447 663e8e51 ths
//~ #define PCI_ADDRESS_SPACE_MEM_PREFETCH 0
448 663e8e51 ths
#endif
449 663e8e51 ths
#if 0
450 663e8e51 ths
    /* PCI Base Address Registers */
451 663e8e51 ths
    /* CSR Memory Mapped Base Address */
452 663e8e51 ths
    PCI_CONFIG_32(PCI_BASE_ADDRESS_0,
453 663e8e51 ths
                  PCI_ADDRESS_SPACE_MEM | PCI_ADDRESS_SPACE_MEM_PREFETCH);
454 663e8e51 ths
    /* CSR I/O Mapped Base Address */
455 663e8e51 ths
    PCI_CONFIG_32(PCI_BASE_ADDRESS_1, PCI_ADDRESS_SPACE_IO);
456 663e8e51 ths
#if 0
457 663e8e51 ths
    /* Flash Memory Mapped Base Address */
458 663e8e51 ths
    PCI_CONFIG_32(PCI_BASE_ADDRESS_2, 0xfffe0000 | PCI_ADDRESS_SPACE_MEM);
459 663e8e51 ths
#endif
460 663e8e51 ths
#endif
461 663e8e51 ths
    /* Expansion ROM Base Address (depends on boot disable!!!) */
462 663e8e51 ths
    PCI_CONFIG_32(0x30, 0x00000000);
463 663e8e51 ths
    /* Capability Pointer */
464 663e8e51 ths
    PCI_CONFIG_8(0x34, 0xdc);
465 663e8e51 ths
    /* Interrupt Pin */
466 663e8e51 ths
    PCI_CONFIG_8(0x3d, 1);      // interrupt pin 0
467 663e8e51 ths
    /* Minimum Grant */
468 663e8e51 ths
    PCI_CONFIG_8(0x3e, 0x08);
469 663e8e51 ths
    /* Maximum Latency */
470 663e8e51 ths
    PCI_CONFIG_8(0x3f, 0x18);
471 663e8e51 ths
    /* Power Management Capabilities / Next Item Pointer / Capability ID */
472 663e8e51 ths
    PCI_CONFIG_32(0xdc, 0x7e210001);
473 663e8e51 ths
474 663e8e51 ths
    switch (device) {
475 663e8e51 ths
    case i82551:
476 663e8e51 ths
        //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1209);
477 663e8e51 ths
        PCI_CONFIG_8(PCI_REVISION_ID, 0x0f);
478 663e8e51 ths
        break;
479 663e8e51 ths
    case i82557B:
480 663e8e51 ths
        PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
481 663e8e51 ths
        PCI_CONFIG_8(PCI_REVISION_ID, 0x02);
482 663e8e51 ths
        break;
483 663e8e51 ths
    case i82557C:
484 663e8e51 ths
        PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
485 663e8e51 ths
        PCI_CONFIG_8(PCI_REVISION_ID, 0x03);
486 663e8e51 ths
        break;
487 663e8e51 ths
    case i82558B:
488 663e8e51 ths
        PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
489 663e8e51 ths
        PCI_CONFIG_16(PCI_STATUS, 0x2810);
490 663e8e51 ths
        PCI_CONFIG_8(PCI_REVISION_ID, 0x05);
491 663e8e51 ths
        break;
492 663e8e51 ths
    case i82559C:
493 663e8e51 ths
        PCI_CONFIG_16(PCI_DEVICE_ID, 0x1229);
494 663e8e51 ths
        PCI_CONFIG_16(PCI_STATUS, 0x2810);
495 663e8e51 ths
        //~ PCI_CONFIG_8(PCI_REVISION_ID, 0x08);
496 663e8e51 ths
        break;
497 663e8e51 ths
    case i82559ER:
498 663e8e51 ths
        //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1209);
499 663e8e51 ths
        PCI_CONFIG_16(PCI_STATUS, 0x2810);
500 663e8e51 ths
        PCI_CONFIG_8(PCI_REVISION_ID, 0x09);
501 663e8e51 ths
        break;
502 663e8e51 ths
    //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1029);
503 663e8e51 ths
    //~ PCI_CONFIG_16(PCI_DEVICE_ID, 0x1030);       /* 82559 InBusiness 10/100 */
504 663e8e51 ths
    default:
505 663e8e51 ths
        logout("Device %X is undefined!\n", device);
506 663e8e51 ths
    }
507 663e8e51 ths
508 663e8e51 ths
    if (device == i82557C || device == i82558B || device == i82559C) {
509 663e8e51 ths
        logout("Get device id and revision from EEPROM!!!\n");
510 663e8e51 ths
    }
511 663e8e51 ths
}
512 663e8e51 ths
513 663e8e51 ths
static void nic_selective_reset(EEPRO100State * s)
514 663e8e51 ths
{
515 663e8e51 ths
    size_t i;
516 663e8e51 ths
    uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
517 663e8e51 ths
    //~ eeprom93xx_reset(s->eeprom);
518 663e8e51 ths
    memcpy(eeprom_contents, s->macaddr, 6);
519 663e8e51 ths
    eeprom_contents[0xa] = 0x4000;
520 663e8e51 ths
    uint16_t sum = 0;
521 663e8e51 ths
    for (i = 0; i < EEPROM_SIZE - 1; i++) {
522 663e8e51 ths
        sum += eeprom_contents[i];
523 663e8e51 ths
    }
524 663e8e51 ths
    eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum;
525 663e8e51 ths
526 663e8e51 ths
    memset(s->mem, 0, sizeof(s->mem));
527 663e8e51 ths
    uint32_t val = BIT(21);
528 663e8e51 ths
    memcpy(&s->mem[SCBCtrlMDI], &val, sizeof(val));
529 663e8e51 ths
530 663e8e51 ths
    assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default));
531 663e8e51 ths
    memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem));
532 663e8e51 ths
}
533 663e8e51 ths
534 663e8e51 ths
static void nic_reset(void *opaque)
535 663e8e51 ths
{
536 663e8e51 ths
    EEPRO100State *s = (EEPRO100State *) opaque;
537 663e8e51 ths
    logout("%p\n", s);
538 663e8e51 ths
    static int first;
539 663e8e51 ths
    if (!first) {
540 663e8e51 ths
        first = 1;
541 663e8e51 ths
    }
542 663e8e51 ths
    nic_selective_reset(s);
543 663e8e51 ths
}
544 663e8e51 ths
545 663e8e51 ths
#if defined(DEBUG_EEPRO100)
546 663e8e51 ths
static const char *reg[PCI_IO_SIZE / 4] = {
547 663e8e51 ths
    "Command/Status",
548 663e8e51 ths
    "General Pointer",
549 663e8e51 ths
    "Port",
550 663e8e51 ths
    "EEPROM/Flash Control",
551 663e8e51 ths
    "MDI Control",
552 663e8e51 ths
    "Receive DMA Byte Count",
553 663e8e51 ths
    "Flow control register",
554 663e8e51 ths
    "General Status/Control"
555 663e8e51 ths
};
556 663e8e51 ths
557 663e8e51 ths
static char *regname(uint32_t addr)
558 663e8e51 ths
{
559 663e8e51 ths
    static char buf[16];
560 663e8e51 ths
    if (addr < PCI_IO_SIZE) {
561 663e8e51 ths
        const char *r = reg[addr / 4];
562 663e8e51 ths
        if (r != 0) {
563 663e8e51 ths
            sprintf(buf, "%s+%u", r, addr % 4);
564 663e8e51 ths
        } else {
565 663e8e51 ths
            sprintf(buf, "0x%02x", addr);
566 663e8e51 ths
        }
567 663e8e51 ths
    } else {
568 663e8e51 ths
        sprintf(buf, "??? 0x%08x", addr);
569 663e8e51 ths
    }
570 663e8e51 ths
    return buf;
571 663e8e51 ths
}
572 663e8e51 ths
#endif                          /* DEBUG_EEPRO100 */
573 663e8e51 ths
574 663e8e51 ths
#if 0
575 663e8e51 ths
static uint16_t eepro100_read_status(EEPRO100State * s)
576 663e8e51 ths
{
577 663e8e51 ths
    uint16_t val = s->status;
578 663e8e51 ths
    logout("val=0x%04x\n", val);
579 663e8e51 ths
    return val;
580 663e8e51 ths
}
581 663e8e51 ths

582 663e8e51 ths
static void eepro100_write_status(EEPRO100State * s, uint16_t val)
583 663e8e51 ths
{
584 663e8e51 ths
    logout("val=0x%04x\n", val);
585 663e8e51 ths
    s->status = val;
586 663e8e51 ths
}
587 663e8e51 ths
#endif
588 663e8e51 ths
589 663e8e51 ths
/*****************************************************************************
590 663e8e51 ths
 *
591 663e8e51 ths
 * Command emulation.
592 663e8e51 ths
 *
593 663e8e51 ths
 ****************************************************************************/
594 663e8e51 ths
595 663e8e51 ths
#if 0
596 663e8e51 ths
static uint16_t eepro100_read_command(EEPRO100State * s)
597 663e8e51 ths
{
598 663e8e51 ths
    uint16_t val = 0xffff;
599 663e8e51 ths
    //~ logout("val=0x%04x\n", val);
600 663e8e51 ths
    return val;
601 663e8e51 ths
}
602 663e8e51 ths
#endif
603 663e8e51 ths
604 663e8e51 ths
/* Commands that can be put in a command list entry. */
605 663e8e51 ths
enum commands {
606 663e8e51 ths
    CmdNOp = 0,
607 663e8e51 ths
    CmdIASetup = 1,
608 663e8e51 ths
    CmdConfigure = 2,
609 663e8e51 ths
    CmdMulticastList = 3,
610 663e8e51 ths
    CmdTx = 4,
611 663e8e51 ths
    CmdTDR = 5,                 /* load microcode */
612 663e8e51 ths
    CmdDump = 6,
613 663e8e51 ths
    CmdDiagnose = 7,
614 663e8e51 ths
615 663e8e51 ths
    /* And some extra flags: */
616 663e8e51 ths
    CmdSuspend = 0x4000,        /* Suspend after completion. */
617 663e8e51 ths
    CmdIntr = 0x2000,           /* Interrupt after completion. */
618 663e8e51 ths
    CmdTxFlex = 0x0008,         /* Use "Flexible mode" for CmdTx command. */
619 663e8e51 ths
};
620 663e8e51 ths
621 663e8e51 ths
static cu_state_t get_cu_state(EEPRO100State * s)
622 663e8e51 ths
{
623 663e8e51 ths
    return ((s->mem[SCBStatus] >> 6) & 0x03);
624 663e8e51 ths
}
625 663e8e51 ths
626 663e8e51 ths
static void set_cu_state(EEPRO100State * s, cu_state_t state)
627 663e8e51 ths
{
628 663e8e51 ths
    s->mem[SCBStatus] = (s->mem[SCBStatus] & 0x3f) + (state << 6);
629 663e8e51 ths
}
630 663e8e51 ths
631 663e8e51 ths
static ru_state_t get_ru_state(EEPRO100State * s)
632 663e8e51 ths
{
633 663e8e51 ths
    return ((s->mem[SCBStatus] >> 2) & 0x0f);
634 663e8e51 ths
}
635 663e8e51 ths
636 663e8e51 ths
static void set_ru_state(EEPRO100State * s, ru_state_t state)
637 663e8e51 ths
{
638 663e8e51 ths
    s->mem[SCBStatus] = (s->mem[SCBStatus] & 0xc3) + (state << 2);
639 663e8e51 ths
}
640 663e8e51 ths
641 663e8e51 ths
static void dump_statistics(EEPRO100State * s)
642 663e8e51 ths
{
643 663e8e51 ths
    /* Dump statistical data. Most data is never changed by the emulation
644 663e8e51 ths
     * and always 0, so we first just copy the whole block and then those
645 663e8e51 ths
     * values which really matter.
646 663e8e51 ths
     * Number of data should check configuration!!!
647 663e8e51 ths
     */
648 663e8e51 ths
    cpu_physical_memory_write(s->statsaddr, (uint8_t *) & s->statistics, 64);
649 663e8e51 ths
    stl_phys(s->statsaddr + 0, s->statistics.tx_good_frames);
650 663e8e51 ths
    stl_phys(s->statsaddr + 36, s->statistics.rx_good_frames);
651 663e8e51 ths
    stl_phys(s->statsaddr + 48, s->statistics.rx_resource_errors);
652 663e8e51 ths
    stl_phys(s->statsaddr + 60, s->statistics.rx_short_frame_errors);
653 663e8e51 ths
    //~ stw_phys(s->statsaddr + 76, s->statistics.xmt_tco_frames);
654 663e8e51 ths
    //~ stw_phys(s->statsaddr + 78, s->statistics.rcv_tco_frames);
655 663e8e51 ths
    //~ missing("CU dump statistical counters");
656 663e8e51 ths
}
657 663e8e51 ths
658 663e8e51 ths
static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
659 663e8e51 ths
{
660 663e8e51 ths
    eepro100_tx_t tx;
661 663e8e51 ths
    uint32_t cb_address;
662 663e8e51 ths
    switch (val) {
663 663e8e51 ths
    case CU_NOP:
664 663e8e51 ths
        /* No operation. */
665 663e8e51 ths
        break;
666 663e8e51 ths
    case CU_START:
667 663e8e51 ths
        if (get_cu_state(s) != cu_idle) {
668 663e8e51 ths
            /* Intel documentation says that CU must be idle for the CU
669 663e8e51 ths
             * start command. Intel driver for Linux also starts the CU
670 663e8e51 ths
             * from suspended state. */
671 663e8e51 ths
            logout("CU state is %u, should be %u\n", get_cu_state(s), cu_idle);
672 663e8e51 ths
            //~ assert(!"wrong CU state");
673 663e8e51 ths
        }
674 663e8e51 ths
        set_cu_state(s, cu_active);
675 663e8e51 ths
        s->cu_offset = s->pointer;
676 663e8e51 ths
      next_command:
677 663e8e51 ths
        cb_address = s->cu_base + s->cu_offset;
678 663e8e51 ths
        cpu_physical_memory_read(cb_address, (uint8_t *) & tx, sizeof(tx));
679 663e8e51 ths
        uint16_t status = le16_to_cpu(tx.status);
680 663e8e51 ths
        uint16_t command = le16_to_cpu(tx.command);
681 663e8e51 ths
        logout
682 663e8e51 ths
            ("val=0x%02x (cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
683 663e8e51 ths
             val, status, command, tx.link);
684 663e8e51 ths
        bool bit_el = ((command & 0x8000) != 0);
685 663e8e51 ths
        bool bit_s = ((command & 0x4000) != 0);
686 663e8e51 ths
        bool bit_i = ((command & 0x2000) != 0);
687 663e8e51 ths
        bool bit_nc = ((command & 0x0010) != 0);
688 663e8e51 ths
        //~ bool bit_sf = ((command & 0x0008) != 0);
689 663e8e51 ths
        uint16_t cmd = command & 0x0007;
690 663e8e51 ths
        s->cu_offset = le32_to_cpu(tx.link);
691 663e8e51 ths
        switch (cmd) {
692 663e8e51 ths
        case CmdNOp:
693 663e8e51 ths
            /* Do nothing. */
694 663e8e51 ths
            break;
695 663e8e51 ths
        case CmdIASetup:
696 663e8e51 ths
            cpu_physical_memory_read(cb_address + 8, &s->macaddr[0], 6);
697 663e8e51 ths
            logout("macaddr: %s\n", nic_dump(&s->macaddr[0], 6));
698 663e8e51 ths
            break;
699 663e8e51 ths
        case CmdConfigure:
700 663e8e51 ths
            cpu_physical_memory_read(cb_address + 8, &s->configuration[0],
701 663e8e51 ths
                                     sizeof(s->configuration));
702 663e8e51 ths
            logout("configuration: %s\n", nic_dump(&s->configuration[0], 16));
703 663e8e51 ths
            break;
704 663e8e51 ths
        case CmdMulticastList:
705 663e8e51 ths
            //~ missing("multicast list");
706 663e8e51 ths
            break;
707 663e8e51 ths
        case CmdTx:
708 663e8e51 ths
            (void)0;
709 663e8e51 ths
            uint32_t tbd_array = le32_to_cpu(tx.tx_desc_addr);
710 663e8e51 ths
            uint16_t tcb_bytes = (le16_to_cpu(tx.tcb_bytes) & 0x3fff);
711 663e8e51 ths
            logout
712 663e8e51 ths
                ("transmit, TBD array address 0x%08x, TCB byte count 0x%04x, TBD count %u\n",
713 663e8e51 ths
                 tbd_array, tcb_bytes, tx.tbd_count);
714 663e8e51 ths
            assert(!bit_nc);
715 663e8e51 ths
            //~ assert(!bit_sf);
716 663e8e51 ths
            assert(tcb_bytes <= 2600);
717 663e8e51 ths
            /* Next assertion fails for local configuration. */
718 663e8e51 ths
            //~ assert((tcb_bytes > 0) || (tbd_array != 0xffffffff));
719 663e8e51 ths
            if (!((tcb_bytes > 0) || (tbd_array != 0xffffffff))) {
720 663e8e51 ths
                logout
721 663e8e51 ths
                    ("illegal values of TBD array address and TCB byte count!\n");
722 663e8e51 ths
            }
723 663e8e51 ths
            uint8_t buf[MAX_ETH_FRAME_SIZE + 4];
724 663e8e51 ths
            uint16_t size = 0;
725 663e8e51 ths
            uint32_t tbd_address = cb_address + 0x10;
726 663e8e51 ths
            assert(tcb_bytes <= sizeof(buf));
727 663e8e51 ths
            while (size < tcb_bytes) {
728 663e8e51 ths
                uint32_t tx_buffer_address = ldl_phys(tbd_address);
729 663e8e51 ths
                uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
730 663e8e51 ths
                //~ uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
731 663e8e51 ths
                tbd_address += 8;
732 663e8e51 ths
                logout
733 663e8e51 ths
                    ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
734 663e8e51 ths
                     tx_buffer_address, tx_buffer_size);
735 663e8e51 ths
                cpu_physical_memory_read(tx_buffer_address, &buf[size],
736 663e8e51 ths
                                         tx_buffer_size);
737 663e8e51 ths
                size += tx_buffer_size;
738 663e8e51 ths
            }
739 663e8e51 ths
            if (tbd_array == 0xffffffff) {
740 663e8e51 ths
                /* Simplified mode. Was already handled by code above. */
741 663e8e51 ths
            } else {
742 663e8e51 ths
                /* Flexible mode. */
743 663e8e51 ths
                uint8_t tbd_count = 0;
744 663e8e51 ths
                if (!(s->configuration[6] & BIT(4))) {
745 663e8e51 ths
                    /* Extended TCB. */
746 663e8e51 ths
                    assert(tcb_bytes == 0);
747 663e8e51 ths
                    for (; tbd_count < 2; tbd_count++) {
748 663e8e51 ths
                        uint32_t tx_buffer_address = ldl_phys(tbd_address);
749 663e8e51 ths
                        uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
750 663e8e51 ths
                        uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
751 663e8e51 ths
                        tbd_address += 8;
752 663e8e51 ths
                        logout
753 663e8e51 ths
                            ("TBD (extended mode): buffer address 0x%08x, size 0x%04x\n",
754 663e8e51 ths
                             tx_buffer_address, tx_buffer_size);
755 663e8e51 ths
                        cpu_physical_memory_read(tx_buffer_address, &buf[size],
756 663e8e51 ths
                                                 tx_buffer_size);
757 663e8e51 ths
                        size += tx_buffer_size;
758 663e8e51 ths
                        if (tx_buffer_el & 1) {
759 663e8e51 ths
                            break;
760 663e8e51 ths
                        }
761 663e8e51 ths
                    }
762 663e8e51 ths
                }
763 663e8e51 ths
                tbd_address = tbd_array;
764 663e8e51 ths
                for (; tbd_count < tx.tbd_count; tbd_count++) {
765 663e8e51 ths
                    uint32_t tx_buffer_address = ldl_phys(tbd_address);
766 663e8e51 ths
                    uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
767 663e8e51 ths
                    uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
768 663e8e51 ths
                    tbd_address += 8;
769 663e8e51 ths
                    logout
770 663e8e51 ths
                        ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
771 663e8e51 ths
                         tx_buffer_address, tx_buffer_size);
772 663e8e51 ths
                    cpu_physical_memory_read(tx_buffer_address, &buf[size],
773 663e8e51 ths
                                             tx_buffer_size);
774 663e8e51 ths
                    size += tx_buffer_size;
775 663e8e51 ths
                    if (tx_buffer_el & 1) {
776 663e8e51 ths
                        break;
777 663e8e51 ths
                    }
778 663e8e51 ths
                }
779 663e8e51 ths
            }
780 663e8e51 ths
            qemu_send_packet(s->vc, buf, size);
781 663e8e51 ths
            s->statistics.tx_good_frames++;
782 663e8e51 ths
            /* Transmit with bad status would raise an CX/TNO interrupt.
783 663e8e51 ths
             * (82557 only). Emulation never has bad status. */
784 663e8e51 ths
            //~ eepro100_cx_interrupt(s);
785 663e8e51 ths
            break;
786 663e8e51 ths
        case CmdTDR:
787 663e8e51 ths
            logout("load microcode\n");
788 663e8e51 ths
            /* Starting with offset 8, the command contains
789 663e8e51 ths
             * 64 dwords microcode which we just ignore here. */
790 663e8e51 ths
            break;
791 663e8e51 ths
        default:
792 663e8e51 ths
            missing("undefined command");
793 663e8e51 ths
        }
794 663e8e51 ths
        /* Write new status (success). */
795 663e8e51 ths
        stw_phys(cb_address, status | 0x8000 | 0x2000);
796 663e8e51 ths
        if (bit_i) {
797 663e8e51 ths
            /* CU completed action. */
798 663e8e51 ths
            eepro100_cx_interrupt(s);
799 663e8e51 ths
        }
800 663e8e51 ths
        if (bit_el) {
801 663e8e51 ths
            /* CU becomes idle. */
802 663e8e51 ths
            set_cu_state(s, cu_idle);
803 663e8e51 ths
            eepro100_cna_interrupt(s);
804 663e8e51 ths
        } else if (bit_s) {
805 663e8e51 ths
            /* CU becomes suspended. */
806 663e8e51 ths
            set_cu_state(s, cu_suspended);
807 663e8e51 ths
            eepro100_cna_interrupt(s);
808 663e8e51 ths
        } else {
809 663e8e51 ths
            /* More entries in list. */
810 663e8e51 ths
            logout("CU list with at least one more entry\n");
811 663e8e51 ths
            goto next_command;
812 663e8e51 ths
        }
813 663e8e51 ths
        logout("CU list empty\n");
814 663e8e51 ths
        /* List is empty. Now CU is idle or suspended. */
815 663e8e51 ths
        break;
816 663e8e51 ths
    case CU_RESUME:
817 663e8e51 ths
        if (get_cu_state(s) != cu_suspended) {
818 663e8e51 ths
            logout("bad CU resume from CU state %u\n", get_cu_state(s));
819 663e8e51 ths
            /* Workaround for bad Linux eepro100 driver which resumes
820 663e8e51 ths
             * from idle state. */
821 663e8e51 ths
            //~ missing("cu resume");
822 663e8e51 ths
            set_cu_state(s, cu_suspended);
823 663e8e51 ths
        }
824 663e8e51 ths
        if (get_cu_state(s) == cu_suspended) {
825 663e8e51 ths
            logout("CU resuming\n");
826 663e8e51 ths
            set_cu_state(s, cu_active);
827 663e8e51 ths
            goto next_command;
828 663e8e51 ths
        }
829 663e8e51 ths
        break;
830 663e8e51 ths
    case CU_STATSADDR:
831 663e8e51 ths
        /* Load dump counters address. */
832 663e8e51 ths
        s->statsaddr = s->pointer;
833 663e8e51 ths
        logout("val=0x%02x (status address)\n", val);
834 663e8e51 ths
        break;
835 663e8e51 ths
    case CU_SHOWSTATS:
836 663e8e51 ths
        /* Dump statistical counters. */
837 663e8e51 ths
        dump_statistics(s);
838 663e8e51 ths
        break;
839 663e8e51 ths
    case CU_CMD_BASE:
840 663e8e51 ths
        /* Load CU base. */
841 663e8e51 ths
        logout("val=0x%02x (CU base address)\n", val);
842 663e8e51 ths
        s->cu_base = s->pointer;
843 663e8e51 ths
        break;
844 663e8e51 ths
    case CU_DUMPSTATS:
845 663e8e51 ths
        /* Dump and reset statistical counters. */
846 663e8e51 ths
        dump_statistics(s);
847 663e8e51 ths
        memset(&s->statistics, 0, sizeof(s->statistics));
848 663e8e51 ths
        break;
849 663e8e51 ths
    case CU_SRESUME:
850 663e8e51 ths
        /* CU static resume. */
851 663e8e51 ths
        missing("CU static resume");
852 663e8e51 ths
        break;
853 663e8e51 ths
    default:
854 663e8e51 ths
        missing("Undefined CU command");
855 663e8e51 ths
    }
856 663e8e51 ths
}
857 663e8e51 ths
858 663e8e51 ths
static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
859 663e8e51 ths
{
860 663e8e51 ths
    switch (val) {
861 663e8e51 ths
    case RU_NOP:
862 663e8e51 ths
        /* No operation. */
863 663e8e51 ths
        break;
864 663e8e51 ths
    case RX_START:
865 663e8e51 ths
        /* RU start. */
866 663e8e51 ths
        if (get_ru_state(s) != ru_idle) {
867 663e8e51 ths
            logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
868 663e8e51 ths
            //~ assert(!"wrong RU state");
869 663e8e51 ths
        }
870 663e8e51 ths
        set_ru_state(s, ru_ready);
871 663e8e51 ths
        s->ru_offset = s->pointer;
872 663e8e51 ths
        logout("val=0x%02x (rx start)\n", val);
873 663e8e51 ths
        break;
874 663e8e51 ths
    case RX_RESUME:
875 663e8e51 ths
        /* Restart RU. */
876 663e8e51 ths
        if (get_ru_state(s) != ru_suspended) {
877 663e8e51 ths
            logout("RU state is %u, should be %u\n", get_ru_state(s),
878 663e8e51 ths
                   ru_suspended);
879 663e8e51 ths
            //~ assert(!"wrong RU state");
880 663e8e51 ths
        }
881 663e8e51 ths
        set_ru_state(s, ru_ready);
882 663e8e51 ths
        break;
883 663e8e51 ths
    case RX_ADDR_LOAD:
884 663e8e51 ths
        /* Load RU base. */
885 663e8e51 ths
        logout("val=0x%02x (RU base address)\n", val);
886 663e8e51 ths
        s->ru_base = s->pointer;
887 663e8e51 ths
        break;
888 663e8e51 ths
    default:
889 663e8e51 ths
        logout("val=0x%02x (undefined RU command)\n", val);
890 663e8e51 ths
        missing("Undefined SU command");
891 663e8e51 ths
    }
892 663e8e51 ths
}
893 663e8e51 ths
894 663e8e51 ths
static void eepro100_write_command(EEPRO100State * s, uint8_t val)
895 663e8e51 ths
{
896 663e8e51 ths
    eepro100_ru_command(s, val & 0x0f);
897 663e8e51 ths
    eepro100_cu_command(s, val & 0xf0);
898 663e8e51 ths
    if ((val) == 0) {
899 663e8e51 ths
        logout("val=0x%02x\n", val);
900 663e8e51 ths
    }
901 663e8e51 ths
    /* Clear command byte after command was accepted. */
902 663e8e51 ths
    s->mem[SCBCmd] = 0;
903 663e8e51 ths
}
904 663e8e51 ths
905 663e8e51 ths
/*****************************************************************************
906 663e8e51 ths
 *
907 663e8e51 ths
 * EEPROM emulation.
908 663e8e51 ths
 *
909 663e8e51 ths
 ****************************************************************************/
910 663e8e51 ths
911 663e8e51 ths
#define EEPROM_CS       0x02
912 663e8e51 ths
#define EEPROM_SK       0x01
913 663e8e51 ths
#define EEPROM_DI       0x04
914 663e8e51 ths
#define EEPROM_DO       0x08
915 663e8e51 ths
916 663e8e51 ths
static uint16_t eepro100_read_eeprom(EEPRO100State * s)
917 663e8e51 ths
{
918 663e8e51 ths
    uint16_t val;
919 663e8e51 ths
    memcpy(&val, &s->mem[SCBeeprom], sizeof(val));
920 663e8e51 ths
    if (eeprom93xx_read(s->eeprom)) {
921 663e8e51 ths
        val |= EEPROM_DO;
922 663e8e51 ths
    } else {
923 663e8e51 ths
        val &= ~EEPROM_DO;
924 663e8e51 ths
    }
925 663e8e51 ths
    return val;
926 663e8e51 ths
}
927 663e8e51 ths
928 663e8e51 ths
static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
929 663e8e51 ths
{
930 663e8e51 ths
    logout("write val=0x%02x\n", val);
931 663e8e51 ths
932 663e8e51 ths
    /* mask unwriteable bits */
933 663e8e51 ths
    //~ val = SET_MASKED(val, 0x31, eeprom->value);
934 663e8e51 ths
935 663e8e51 ths
    int eecs = ((val & EEPROM_CS) != 0);
936 663e8e51 ths
    int eesk = ((val & EEPROM_SK) != 0);
937 663e8e51 ths
    int eedi = ((val & EEPROM_DI) != 0);
938 663e8e51 ths
    eeprom93xx_write(eeprom, eecs, eesk, eedi);
939 663e8e51 ths
}
940 663e8e51 ths
941 663e8e51 ths
static void eepro100_write_pointer(EEPRO100State * s, uint32_t val)
942 663e8e51 ths
{
943 663e8e51 ths
    s->pointer = le32_to_cpu(val);
944 663e8e51 ths
    logout("val=0x%08x\n", val);
945 663e8e51 ths
}
946 663e8e51 ths
947 663e8e51 ths
/*****************************************************************************
948 663e8e51 ths
 *
949 663e8e51 ths
 * MDI emulation.
950 663e8e51 ths
 *
951 663e8e51 ths
 ****************************************************************************/
952 663e8e51 ths
953 663e8e51 ths
#if defined(DEBUG_EEPRO100)
954 663e8e51 ths
static const char *mdi_op_name[] = {
955 663e8e51 ths
    "opcode 0",
956 663e8e51 ths
    "write",
957 663e8e51 ths
    "read",
958 663e8e51 ths
    "opcode 3"
959 663e8e51 ths
};
960 663e8e51 ths
961 663e8e51 ths
static const char *mdi_reg_name[] = {
962 663e8e51 ths
    "Control",
963 663e8e51 ths
    "Status",
964 663e8e51 ths
    "PHY Identification (Word 1)",
965 663e8e51 ths
    "PHY Identification (Word 2)",
966 663e8e51 ths
    "Auto-Negotiation Advertisement",
967 663e8e51 ths
    "Auto-Negotiation Link Partner Ability",
968 663e8e51 ths
    "Auto-Negotiation Expansion"
969 663e8e51 ths
};
970 663e8e51 ths
#endif                          /* DEBUG_EEPRO100 */
971 663e8e51 ths
972 663e8e51 ths
static uint32_t eepro100_read_mdi(EEPRO100State * s)
973 663e8e51 ths
{
974 663e8e51 ths
    uint32_t val;
975 663e8e51 ths
    memcpy(&val, &s->mem[0x10], sizeof(val));
976 663e8e51 ths
977 663e8e51 ths
#ifdef DEBUG_EEPRO100
978 663e8e51 ths
    uint8_t raiseint = (val & BIT(29)) >> 29;
979 663e8e51 ths
    uint8_t opcode = (val & BITS(27, 26)) >> 26;
980 663e8e51 ths
    uint8_t phy = (val & BITS(25, 21)) >> 21;
981 663e8e51 ths
    uint8_t reg = (val & BITS(20, 16)) >> 16;
982 663e8e51 ths
    uint16_t data = (val & BITS(15, 0));
983 663e8e51 ths
#endif
984 663e8e51 ths
    /* Emulation takes no time to finish MDI transaction. */
985 663e8e51 ths
    val |= BIT(28);
986 663e8e51 ths
    TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
987 663e8e51 ths
                      val, raiseint, mdi_op_name[opcode], phy,
988 663e8e51 ths
                      mdi_reg_name[reg], data));
989 663e8e51 ths
    return val;
990 663e8e51 ths
}
991 663e8e51 ths
992 663e8e51 ths
//~ #define BITS(val, upper, lower) (val & ???)
993 663e8e51 ths
static void eepro100_write_mdi(EEPRO100State * s, uint32_t val)
994 663e8e51 ths
{
995 663e8e51 ths
    uint8_t raiseint = (val & BIT(29)) >> 29;
996 663e8e51 ths
    uint8_t opcode = (val & BITS(27, 26)) >> 26;
997 663e8e51 ths
    uint8_t phy = (val & BITS(25, 21)) >> 21;
998 663e8e51 ths
    uint8_t reg = (val & BITS(20, 16)) >> 16;
999 663e8e51 ths
    uint16_t data = (val & BITS(15, 0));
1000 663e8e51 ths
    if (phy != 1) {
1001 663e8e51 ths
        /* Unsupported PHY address. */
1002 663e8e51 ths
        //~ logout("phy must be 1 but is %u\n", phy);
1003 663e8e51 ths
        data = 0;
1004 663e8e51 ths
    } else if (opcode != 1 && opcode != 2) {
1005 663e8e51 ths
        /* Unsupported opcode. */
1006 663e8e51 ths
        logout("opcode must be 1 or 2 but is %u\n", opcode);
1007 663e8e51 ths
        data = 0;
1008 663e8e51 ths
    } else if (reg > 6) {
1009 663e8e51 ths
        /* Unsupported register. */
1010 663e8e51 ths
        logout("register must be 0...6 but is %u\n", reg);
1011 663e8e51 ths
        data = 0;
1012 663e8e51 ths
    } else {
1013 663e8e51 ths
        TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1014 663e8e51 ths
                          val, raiseint, mdi_op_name[opcode], phy,
1015 663e8e51 ths
                          mdi_reg_name[reg], data));
1016 663e8e51 ths
        if (opcode == 1) {
1017 663e8e51 ths
            /* MDI write */
1018 663e8e51 ths
            switch (reg) {
1019 663e8e51 ths
            case 0:            /* Control Register */
1020 663e8e51 ths
                if (data & 0x8000) {
1021 663e8e51 ths
                    /* Reset status and control registers to default. */
1022 663e8e51 ths
                    s->mdimem[0] = eepro100_mdi_default[0];
1023 663e8e51 ths
                    s->mdimem[1] = eepro100_mdi_default[1];
1024 663e8e51 ths
                    data = s->mdimem[reg];
1025 663e8e51 ths
                } else {
1026 663e8e51 ths
                    /* Restart Auto Configuration = Normal Operation */
1027 663e8e51 ths
                    data &= ~0x0200;
1028 663e8e51 ths
                }
1029 663e8e51 ths
                break;
1030 663e8e51 ths
            case 1:            /* Status Register */
1031 663e8e51 ths
                missing("not writable");
1032 663e8e51 ths
                data = s->mdimem[reg];
1033 663e8e51 ths
                break;
1034 663e8e51 ths
            case 2:            /* PHY Identification Register (Word 1) */
1035 663e8e51 ths
            case 3:            /* PHY Identification Register (Word 2) */
1036 663e8e51 ths
                missing("not implemented");
1037 663e8e51 ths
                break;
1038 663e8e51 ths
            case 4:            /* Auto-Negotiation Advertisement Register */
1039 663e8e51 ths
            case 5:            /* Auto-Negotiation Link Partner Ability Register */
1040 663e8e51 ths
                break;
1041 663e8e51 ths
            case 6:            /* Auto-Negotiation Expansion Register */
1042 663e8e51 ths
            default:
1043 663e8e51 ths
                missing("not implemented");
1044 663e8e51 ths
            }
1045 663e8e51 ths
            s->mdimem[reg] = data;
1046 663e8e51 ths
        } else if (opcode == 2) {
1047 663e8e51 ths
            /* MDI read */
1048 663e8e51 ths
            switch (reg) {
1049 663e8e51 ths
            case 0:            /* Control Register */
1050 663e8e51 ths
                if (data & 0x8000) {
1051 663e8e51 ths
                    /* Reset status and control registers to default. */
1052 663e8e51 ths
                    s->mdimem[0] = eepro100_mdi_default[0];
1053 663e8e51 ths
                    s->mdimem[1] = eepro100_mdi_default[1];
1054 663e8e51 ths
                }
1055 663e8e51 ths
                break;
1056 663e8e51 ths
            case 1:            /* Status Register */
1057 663e8e51 ths
                s->mdimem[reg] |= 0x0020;
1058 663e8e51 ths
                break;
1059 663e8e51 ths
            case 2:            /* PHY Identification Register (Word 1) */
1060 663e8e51 ths
            case 3:            /* PHY Identification Register (Word 2) */
1061 663e8e51 ths
            case 4:            /* Auto-Negotiation Advertisement Register */
1062 663e8e51 ths
                break;
1063 663e8e51 ths
            case 5:            /* Auto-Negotiation Link Partner Ability Register */
1064 663e8e51 ths
                s->mdimem[reg] = 0x41fe;
1065 663e8e51 ths
                break;
1066 663e8e51 ths
            case 6:            /* Auto-Negotiation Expansion Register */
1067 663e8e51 ths
                s->mdimem[reg] = 0x0001;
1068 663e8e51 ths
                break;
1069 663e8e51 ths
            }
1070 663e8e51 ths
            data = s->mdimem[reg];
1071 663e8e51 ths
        }
1072 663e8e51 ths
        /* Emulation takes no time to finish MDI transaction.
1073 663e8e51 ths
         * Set MDI bit in SCB status register. */
1074 663e8e51 ths
        s->mem[SCBAck] |= 0x08;
1075 663e8e51 ths
        val |= BIT(28);
1076 663e8e51 ths
        if (raiseint) {
1077 663e8e51 ths
            eepro100_mdi_interrupt(s);
1078 663e8e51 ths
        }
1079 663e8e51 ths
    }
1080 663e8e51 ths
    val = (val & 0xffff0000) + data;
1081 663e8e51 ths
    memcpy(&s->mem[0x10], &val, sizeof(val));
1082 663e8e51 ths
}
1083 663e8e51 ths
1084 663e8e51 ths
/*****************************************************************************
1085 663e8e51 ths
 *
1086 663e8e51 ths
 * Port emulation.
1087 663e8e51 ths
 *
1088 663e8e51 ths
 ****************************************************************************/
1089 663e8e51 ths
1090 663e8e51 ths
#define PORT_SOFTWARE_RESET     0
1091 663e8e51 ths
#define PORT_SELFTEST           1
1092 663e8e51 ths
#define PORT_SELECTIVE_RESET    2
1093 663e8e51 ths
#define PORT_DUMP               3
1094 663e8e51 ths
#define PORT_SELECTION_MASK     3
1095 663e8e51 ths
1096 663e8e51 ths
typedef struct {
1097 663e8e51 ths
    uint32_t st_sign;           /* Self Test Signature */
1098 663e8e51 ths
    uint32_t st_result;         /* Self Test Results */
1099 663e8e51 ths
} eepro100_selftest_t;
1100 663e8e51 ths
1101 663e8e51 ths
static uint32_t eepro100_read_port(EEPRO100State * s)
1102 663e8e51 ths
{
1103 663e8e51 ths
    return 0;
1104 663e8e51 ths
}
1105 663e8e51 ths
1106 663e8e51 ths
static void eepro100_write_port(EEPRO100State * s, uint32_t val)
1107 663e8e51 ths
{
1108 663e8e51 ths
    val = le32_to_cpu(val);
1109 663e8e51 ths
    uint32_t address = (val & ~PORT_SELECTION_MASK);
1110 663e8e51 ths
    uint8_t selection = (val & PORT_SELECTION_MASK);
1111 663e8e51 ths
    switch (selection) {
1112 663e8e51 ths
    case PORT_SOFTWARE_RESET:
1113 663e8e51 ths
        nic_reset(s);
1114 663e8e51 ths
        break;
1115 663e8e51 ths
    case PORT_SELFTEST:
1116 663e8e51 ths
        logout("selftest address=0x%08x\n", address);
1117 663e8e51 ths
        eepro100_selftest_t data;
1118 663e8e51 ths
        cpu_physical_memory_read(address, (uint8_t *) & data, sizeof(data));
1119 663e8e51 ths
        data.st_sign = 0xffffffff;
1120 663e8e51 ths
        data.st_result = 0;
1121 663e8e51 ths
        cpu_physical_memory_write(address, (uint8_t *) & data, sizeof(data));
1122 663e8e51 ths
        break;
1123 663e8e51 ths
    case PORT_SELECTIVE_RESET:
1124 663e8e51 ths
        logout("selective reset, selftest address=0x%08x\n", address);
1125 663e8e51 ths
        nic_selective_reset(s);
1126 663e8e51 ths
        break;
1127 663e8e51 ths
    default:
1128 663e8e51 ths
        logout("val=0x%08x\n", val);
1129 663e8e51 ths
        missing("unknown port selection");
1130 663e8e51 ths
    }
1131 663e8e51 ths
}
1132 663e8e51 ths
1133 663e8e51 ths
/*****************************************************************************
1134 663e8e51 ths
 *
1135 663e8e51 ths
 * General hardware emulation.
1136 663e8e51 ths
 *
1137 663e8e51 ths
 ****************************************************************************/
1138 663e8e51 ths
1139 663e8e51 ths
static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
1140 663e8e51 ths
{
1141 663e8e51 ths
    uint8_t val;
1142 663e8e51 ths
    if (addr <= sizeof(s->mem) - sizeof(val)) {
1143 663e8e51 ths
        memcpy(&val, &s->mem[addr], sizeof(val));
1144 663e8e51 ths
    }
1145 663e8e51 ths
1146 663e8e51 ths
    switch (addr) {
1147 663e8e51 ths
    case SCBStatus:
1148 663e8e51 ths
        //~ val = eepro100_read_status(s);
1149 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1150 663e8e51 ths
        break;
1151 663e8e51 ths
    case SCBAck:
1152 663e8e51 ths
        //~ val = eepro100_read_status(s);
1153 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1154 663e8e51 ths
        break;
1155 663e8e51 ths
    case SCBCmd:
1156 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1157 663e8e51 ths
        //~ val = eepro100_read_command(s);
1158 663e8e51 ths
        break;
1159 663e8e51 ths
    case SCBIntmask:
1160 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1161 663e8e51 ths
        break;
1162 663e8e51 ths
    case SCBPort + 3:
1163 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1164 663e8e51 ths
        break;
1165 663e8e51 ths
    case SCBeeprom:
1166 663e8e51 ths
        val = eepro100_read_eeprom(s);
1167 663e8e51 ths
        break;
1168 663e8e51 ths
    case 0x1b:                 /* PMDR (power management driver register) */
1169 663e8e51 ths
        val = 0;
1170 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1171 663e8e51 ths
        break;
1172 663e8e51 ths
    case 0x1d:                 /* general status register */
1173 663e8e51 ths
        /* 100 Mbps full duplex, valid link */
1174 663e8e51 ths
        val = 0x07;
1175 663e8e51 ths
        logout("addr=General Status val=%02x\n", val);
1176 663e8e51 ths
        break;
1177 663e8e51 ths
    default:
1178 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1179 663e8e51 ths
        missing("unknown byte read");
1180 663e8e51 ths
    }
1181 663e8e51 ths
    return val;
1182 663e8e51 ths
}
1183 663e8e51 ths
1184 663e8e51 ths
static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
1185 663e8e51 ths
{
1186 663e8e51 ths
    uint16_t val;
1187 663e8e51 ths
    if (addr <= sizeof(s->mem) - sizeof(val)) {
1188 663e8e51 ths
        memcpy(&val, &s->mem[addr], sizeof(val));
1189 663e8e51 ths
    }
1190 663e8e51 ths
1191 663e8e51 ths
    logout("addr=%s val=0x%04x\n", regname(addr), val);
1192 663e8e51 ths
1193 663e8e51 ths
    switch (addr) {
1194 663e8e51 ths
    case SCBStatus:
1195 663e8e51 ths
        //~ val = eepro100_read_status(s);
1196 663e8e51 ths
        break;
1197 663e8e51 ths
    case SCBeeprom:
1198 663e8e51 ths
        val = eepro100_read_eeprom(s);
1199 663e8e51 ths
        break;
1200 663e8e51 ths
    default:
1201 663e8e51 ths
        logout("addr=%s val=0x%04x\n", regname(addr), val);
1202 663e8e51 ths
        missing("unknown word read");
1203 663e8e51 ths
    }
1204 663e8e51 ths
    return val;
1205 663e8e51 ths
}
1206 663e8e51 ths
1207 663e8e51 ths
static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
1208 663e8e51 ths
{
1209 663e8e51 ths
    uint32_t val;
1210 663e8e51 ths
    if (addr <= sizeof(s->mem) - sizeof(val)) {
1211 663e8e51 ths
        memcpy(&val, &s->mem[addr], sizeof(val));
1212 663e8e51 ths
    }
1213 663e8e51 ths
1214 663e8e51 ths
    switch (addr) {
1215 663e8e51 ths
    case SCBStatus:
1216 663e8e51 ths
        //~ val = eepro100_read_status(s);
1217 663e8e51 ths
        logout("addr=%s val=0x%08x\n", regname(addr), val);
1218 663e8e51 ths
        break;
1219 663e8e51 ths
    case SCBPointer:
1220 663e8e51 ths
        //~ val = eepro100_read_pointer(s);
1221 663e8e51 ths
        logout("addr=%s val=0x%08x\n", regname(addr), val);
1222 663e8e51 ths
        break;
1223 663e8e51 ths
    case SCBPort:
1224 663e8e51 ths
        val = eepro100_read_port(s);
1225 663e8e51 ths
        logout("addr=%s val=0x%08x\n", regname(addr), val);
1226 663e8e51 ths
        break;
1227 663e8e51 ths
    case SCBCtrlMDI:
1228 663e8e51 ths
        val = eepro100_read_mdi(s);
1229 663e8e51 ths
        break;
1230 663e8e51 ths
    default:
1231 663e8e51 ths
        logout("addr=%s val=0x%08x\n", regname(addr), val);
1232 663e8e51 ths
        missing("unknown longword read");
1233 663e8e51 ths
    }
1234 663e8e51 ths
    return val;
1235 663e8e51 ths
}
1236 663e8e51 ths
1237 663e8e51 ths
static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
1238 663e8e51 ths
{
1239 663e8e51 ths
    if (addr <= sizeof(s->mem) - sizeof(val)) {
1240 663e8e51 ths
        memcpy(&s->mem[addr], &val, sizeof(val));
1241 663e8e51 ths
    }
1242 663e8e51 ths
1243 663e8e51 ths
    logout("addr=%s val=0x%02x\n", regname(addr), val);
1244 663e8e51 ths
1245 663e8e51 ths
    switch (addr) {
1246 663e8e51 ths
    case SCBStatus:
1247 663e8e51 ths
        //~ eepro100_write_status(s, val);
1248 663e8e51 ths
        break;
1249 663e8e51 ths
    case SCBAck:
1250 663e8e51 ths
        eepro100_acknowledge(s);
1251 663e8e51 ths
        break;
1252 663e8e51 ths
    case SCBCmd:
1253 663e8e51 ths
        eepro100_write_command(s, val);
1254 663e8e51 ths
        break;
1255 663e8e51 ths
    case SCBIntmask:
1256 663e8e51 ths
        if (val & BIT(1)) {
1257 663e8e51 ths
            eepro100_swi_interrupt(s);
1258 663e8e51 ths
        }
1259 663e8e51 ths
        eepro100_interrupt(s, 0);
1260 663e8e51 ths
        break;
1261 663e8e51 ths
    case SCBPort + 3:
1262 3257d2b6 ths
    case SCBFlow:
1263 3257d2b6 ths
    case SCBFlow + 1:
1264 3257d2b6 ths
    case SCBFlow + 2:
1265 3257d2b6 ths
    case SCBFlow + 3:
1266 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1267 663e8e51 ths
        break;
1268 663e8e51 ths
    case SCBeeprom:
1269 663e8e51 ths
        eepro100_write_eeprom(s->eeprom, val);
1270 663e8e51 ths
        break;
1271 663e8e51 ths
    default:
1272 663e8e51 ths
        logout("addr=%s val=0x%02x\n", regname(addr), val);
1273 663e8e51 ths
        missing("unknown byte write");
1274 663e8e51 ths
    }
1275 663e8e51 ths
}
1276 663e8e51 ths
1277 663e8e51 ths
static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
1278 663e8e51 ths
{
1279 663e8e51 ths
    if (addr <= sizeof(s->mem) - sizeof(val)) {
1280 663e8e51 ths
        memcpy(&s->mem[addr], &val, sizeof(val));
1281 663e8e51 ths
    }
1282 663e8e51 ths
1283 663e8e51 ths
    logout("addr=%s val=0x%04x\n", regname(addr), val);
1284 663e8e51 ths
1285 663e8e51 ths
    switch (addr) {
1286 663e8e51 ths
    case SCBStatus:
1287 663e8e51 ths
        //~ eepro100_write_status(s, val);
1288 663e8e51 ths
        eepro100_acknowledge(s);
1289 663e8e51 ths
        break;
1290 663e8e51 ths
    case SCBCmd:
1291 663e8e51 ths
        eepro100_write_command(s, val);
1292 663e8e51 ths
        eepro100_write1(s, SCBIntmask, val >> 8);
1293 663e8e51 ths
        break;
1294 663e8e51 ths
    case SCBeeprom:
1295 663e8e51 ths
        eepro100_write_eeprom(s->eeprom, val);
1296 663e8e51 ths
        break;
1297 663e8e51 ths
    default:
1298 663e8e51 ths
        logout("addr=%s val=0x%04x\n", regname(addr), val);
1299 663e8e51 ths
        missing("unknown word write");
1300 663e8e51 ths
    }
1301 663e8e51 ths
}
1302 663e8e51 ths
1303 663e8e51 ths
static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
1304 663e8e51 ths
{
1305 663e8e51 ths
    if (addr <= sizeof(s->mem) - sizeof(val)) {
1306 663e8e51 ths
        memcpy(&s->mem[addr], &val, sizeof(val));
1307 663e8e51 ths
    }
1308 663e8e51 ths
1309 663e8e51 ths
    switch (addr) {
1310 663e8e51 ths
    case SCBPointer:
1311 663e8e51 ths
        eepro100_write_pointer(s, val);
1312 663e8e51 ths
        break;
1313 663e8e51 ths
    case SCBPort:
1314 663e8e51 ths
        logout("addr=%s val=0x%08x\n", regname(addr), val);
1315 663e8e51 ths
        eepro100_write_port(s, val);
1316 663e8e51 ths
        break;
1317 663e8e51 ths
    case SCBCtrlMDI:
1318 663e8e51 ths
        eepro100_write_mdi(s, val);
1319 663e8e51 ths
        break;
1320 663e8e51 ths
    default:
1321 663e8e51 ths
        logout("addr=%s val=0x%08x\n", regname(addr), val);
1322 663e8e51 ths
        missing("unknown longword write");
1323 663e8e51 ths
    }
1324 663e8e51 ths
}
1325 663e8e51 ths
1326 663e8e51 ths
static uint32_t ioport_read1(void *opaque, uint32_t addr)
1327 663e8e51 ths
{
1328 663e8e51 ths
    EEPRO100State *s = opaque;
1329 663e8e51 ths
    //~ logout("addr=%s\n", regname(addr));
1330 663e8e51 ths
    return eepro100_read1(s, addr - s->region[1]);
1331 663e8e51 ths
}
1332 663e8e51 ths
1333 663e8e51 ths
static uint32_t ioport_read2(void *opaque, uint32_t addr)
1334 663e8e51 ths
{
1335 663e8e51 ths
    EEPRO100State *s = opaque;
1336 663e8e51 ths
    return eepro100_read2(s, addr - s->region[1]);
1337 663e8e51 ths
}
1338 663e8e51 ths
1339 663e8e51 ths
static uint32_t ioport_read4(void *opaque, uint32_t addr)
1340 663e8e51 ths
{
1341 663e8e51 ths
    EEPRO100State *s = opaque;
1342 663e8e51 ths
    return eepro100_read4(s, addr - s->region[1]);
1343 663e8e51 ths
}
1344 663e8e51 ths
1345 663e8e51 ths
static void ioport_write1(void *opaque, uint32_t addr, uint32_t val)
1346 663e8e51 ths
{
1347 663e8e51 ths
    EEPRO100State *s = opaque;
1348 663e8e51 ths
    //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1349 663e8e51 ths
    eepro100_write1(s, addr - s->region[1], val);
1350 663e8e51 ths
}
1351 663e8e51 ths
1352 663e8e51 ths
static void ioport_write2(void *opaque, uint32_t addr, uint32_t val)
1353 663e8e51 ths
{
1354 663e8e51 ths
    EEPRO100State *s = opaque;
1355 663e8e51 ths
    eepro100_write2(s, addr - s->region[1], val);
1356 663e8e51 ths
}
1357 663e8e51 ths
1358 663e8e51 ths
static void ioport_write4(void *opaque, uint32_t addr, uint32_t val)
1359 663e8e51 ths
{
1360 663e8e51 ths
    EEPRO100State *s = opaque;
1361 663e8e51 ths
    eepro100_write4(s, addr - s->region[1], val);
1362 663e8e51 ths
}
1363 663e8e51 ths
1364 663e8e51 ths
/***********************************************************/
1365 663e8e51 ths
/* PCI EEPRO100 definitions */
1366 663e8e51 ths
1367 663e8e51 ths
typedef struct PCIEEPRO100State {
1368 663e8e51 ths
    PCIDevice dev;
1369 663e8e51 ths
    EEPRO100State eepro100;
1370 663e8e51 ths
} PCIEEPRO100State;
1371 663e8e51 ths
1372 663e8e51 ths
static void pci_map(PCIDevice * pci_dev, int region_num,
1373 663e8e51 ths
                    uint32_t addr, uint32_t size, int type)
1374 663e8e51 ths
{
1375 663e8e51 ths
    PCIEEPRO100State *d = (PCIEEPRO100State *) pci_dev;
1376 663e8e51 ths
    EEPRO100State *s = &d->eepro100;
1377 663e8e51 ths
1378 663e8e51 ths
    logout("region %d, addr=0x%08x, size=0x%08x, type=%d\n",
1379 663e8e51 ths
           region_num, addr, size, type);
1380 663e8e51 ths
1381 663e8e51 ths
    assert(region_num == 1);
1382 663e8e51 ths
    register_ioport_write(addr, size, 1, ioport_write1, s);
1383 663e8e51 ths
    register_ioport_read(addr, size, 1, ioport_read1, s);
1384 663e8e51 ths
    register_ioport_write(addr, size, 2, ioport_write2, s);
1385 663e8e51 ths
    register_ioport_read(addr, size, 2, ioport_read2, s);
1386 663e8e51 ths
    register_ioport_write(addr, size, 4, ioport_write4, s);
1387 663e8e51 ths
    register_ioport_read(addr, size, 4, ioport_read4, s);
1388 663e8e51 ths
1389 663e8e51 ths
    s->region[region_num] = addr;
1390 663e8e51 ths
}
1391 663e8e51 ths
1392 663e8e51 ths
static void pci_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1393 663e8e51 ths
{
1394 663e8e51 ths
    EEPRO100State *s = opaque;
1395 663e8e51 ths
    addr -= s->region[0];
1396 663e8e51 ths
    //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1397 663e8e51 ths
    eepro100_write1(s, addr, val);
1398 663e8e51 ths
}
1399 663e8e51 ths
1400 663e8e51 ths
static void pci_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1401 663e8e51 ths
{
1402 663e8e51 ths
    EEPRO100State *s = opaque;
1403 663e8e51 ths
    addr -= s->region[0];
1404 663e8e51 ths
    //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1405 663e8e51 ths
    eepro100_write2(s, addr, val);
1406 663e8e51 ths
}
1407 663e8e51 ths
1408 663e8e51 ths
static void pci_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
1409 663e8e51 ths
{
1410 663e8e51 ths
    EEPRO100State *s = opaque;
1411 663e8e51 ths
    addr -= s->region[0];
1412 663e8e51 ths
    //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
1413 663e8e51 ths
    eepro100_write4(s, addr, val);
1414 663e8e51 ths
}
1415 663e8e51 ths
1416 663e8e51 ths
static uint32_t pci_mmio_readb(void *opaque, target_phys_addr_t addr)
1417 663e8e51 ths
{
1418 663e8e51 ths
    EEPRO100State *s = opaque;
1419 663e8e51 ths
    addr -= s->region[0];
1420 663e8e51 ths
    //~ logout("addr=%s\n", regname(addr));
1421 663e8e51 ths
    return eepro100_read1(s, addr);
1422 663e8e51 ths
}
1423 663e8e51 ths
1424 663e8e51 ths
static uint32_t pci_mmio_readw(void *opaque, target_phys_addr_t addr)
1425 663e8e51 ths
{
1426 663e8e51 ths
    EEPRO100State *s = opaque;
1427 663e8e51 ths
    addr -= s->region[0];
1428 663e8e51 ths
    //~ logout("addr=%s\n", regname(addr));
1429 663e8e51 ths
    return eepro100_read2(s, addr);
1430 663e8e51 ths
}
1431 663e8e51 ths
1432 663e8e51 ths
static uint32_t pci_mmio_readl(void *opaque, target_phys_addr_t addr)
1433 663e8e51 ths
{
1434 663e8e51 ths
    EEPRO100State *s = opaque;
1435 663e8e51 ths
    addr -= s->region[0];
1436 663e8e51 ths
    //~ logout("addr=%s\n", regname(addr));
1437 663e8e51 ths
    return eepro100_read4(s, addr);
1438 663e8e51 ths
}
1439 663e8e51 ths
1440 663e8e51 ths
static CPUWriteMemoryFunc *pci_mmio_write[] = {
1441 663e8e51 ths
    pci_mmio_writeb,
1442 663e8e51 ths
    pci_mmio_writew,
1443 663e8e51 ths
    pci_mmio_writel
1444 663e8e51 ths
};
1445 663e8e51 ths
1446 663e8e51 ths
static CPUReadMemoryFunc *pci_mmio_read[] = {
1447 663e8e51 ths
    pci_mmio_readb,
1448 663e8e51 ths
    pci_mmio_readw,
1449 663e8e51 ths
    pci_mmio_readl
1450 663e8e51 ths
};
1451 663e8e51 ths
1452 663e8e51 ths
static void pci_mmio_map(PCIDevice * pci_dev, int region_num,
1453 663e8e51 ths
                         uint32_t addr, uint32_t size, int type)
1454 663e8e51 ths
{
1455 663e8e51 ths
    PCIEEPRO100State *d = (PCIEEPRO100State *) pci_dev;
1456 663e8e51 ths
1457 663e8e51 ths
    logout("region %d, addr=0x%08x, size=0x%08x, type=%d\n",
1458 663e8e51 ths
           region_num, addr, size, type);
1459 663e8e51 ths
1460 663e8e51 ths
    if (region_num == 0) {
1461 663e8e51 ths
        /* Map control / status registers. */
1462 663e8e51 ths
        cpu_register_physical_memory(addr, size, d->eepro100.mmio_index);
1463 663e8e51 ths
        d->eepro100.region[region_num] = addr;
1464 663e8e51 ths
    }
1465 663e8e51 ths
}
1466 663e8e51 ths
1467 663e8e51 ths
static int nic_can_receive(void *opaque)
1468 663e8e51 ths
{
1469 663e8e51 ths
    EEPRO100State *s = opaque;
1470 663e8e51 ths
    logout("%p\n", s);
1471 663e8e51 ths
    return get_ru_state(s) == ru_ready;
1472 663e8e51 ths
    //~ return !eepro100_buffer_full(s);
1473 663e8e51 ths
}
1474 663e8e51 ths
1475 663e8e51 ths
#define MIN_BUF_SIZE 60
1476 663e8e51 ths
1477 663e8e51 ths
static void nic_receive(void *opaque, const uint8_t * buf, int size)
1478 663e8e51 ths
{
1479 663e8e51 ths
    /* TODO:
1480 663e8e51 ths
     * - Magic packets should set bit 30 in power management driver register.
1481 663e8e51 ths
     * - Interesting packets should set bit 29 in power management driver register.
1482 663e8e51 ths
     */
1483 663e8e51 ths
    EEPRO100State *s = opaque;
1484 663e8e51 ths
    uint16_t rfd_status = 0xa000;
1485 663e8e51 ths
    static const uint8_t broadcast_macaddr[6] =
1486 663e8e51 ths
        { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1487 663e8e51 ths
1488 663e8e51 ths
    /* TODO: check multiple IA bit. */
1489 663e8e51 ths
    assert(!(s->configuration[20] & BIT(6)));
1490 663e8e51 ths
1491 663e8e51 ths
    if (s->configuration[8] & 0x80) {
1492 663e8e51 ths
        /* CSMA is disabled. */
1493 663e8e51 ths
        logout("%p received while CSMA is disabled\n", s);
1494 663e8e51 ths
        return;
1495 663e8e51 ths
    } else if (size < 64 && (s->configuration[7] & 1)) {
1496 663e8e51 ths
        /* Short frame and configuration byte 7/0 (discard short receive) set:
1497 663e8e51 ths
         * Short frame is discarded */
1498 663e8e51 ths
        logout("%p received short frame (%d byte)\n", s, size);
1499 663e8e51 ths
        s->statistics.rx_short_frame_errors++;
1500 663e8e51 ths
        //~ return;
1501 663e8e51 ths
    } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & 8)) {
1502 663e8e51 ths
        /* Long frame and configuration byte 18/3 (long receive ok) not set:
1503 663e8e51 ths
         * Long frames are discarded. */
1504 663e8e51 ths
        logout("%p received long frame (%d byte), ignored\n", s, size);
1505 663e8e51 ths
        return;
1506 663e8e51 ths
    } else if (memcmp(buf, s->macaddr, 6) == 0) {       // !!!
1507 663e8e51 ths
        /* Frame matches individual address. */
1508 663e8e51 ths
        /* TODO: check configuration byte 15/4 (ignore U/L). */
1509 663e8e51 ths
        logout("%p received frame for me, len=%d\n", s, size);
1510 663e8e51 ths
    } else if (memcmp(buf, broadcast_macaddr, 6) == 0) {
1511 663e8e51 ths
        /* Broadcast frame. */
1512 663e8e51 ths
        logout("%p received broadcast, len=%d\n", s, size);
1513 663e8e51 ths
        rfd_status |= 0x0002;
1514 663e8e51 ths
    } else if (buf[0] & 0x01) { // !!!
1515 663e8e51 ths
        /* Multicast frame. */
1516 663e8e51 ths
        logout("%p received multicast, len=%d\n", s, size);
1517 663e8e51 ths
        /* TODO: check multicast all bit. */
1518 663e8e51 ths
        assert(!(s->configuration[21] & BIT(3)));
1519 663e8e51 ths
        int mcast_idx = compute_mcast_idx(buf);
1520 663e8e51 ths
        if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7)))) {
1521 663e8e51 ths
            return;
1522 663e8e51 ths
        }
1523 663e8e51 ths
        rfd_status |= 0x0002;
1524 663e8e51 ths
    } else if (s->configuration[15] & 1) {
1525 663e8e51 ths
        /* Promiscuous: receive all. */
1526 663e8e51 ths
        logout("%p received frame in promiscuous mode, len=%d\n", s, size);
1527 663e8e51 ths
        rfd_status |= 0x0004;
1528 663e8e51 ths
    } else {
1529 663e8e51 ths
        logout("%p received frame, ignored, len=%d,%s\n", s, size,
1530 663e8e51 ths
               nic_dump(buf, size));
1531 663e8e51 ths
        return;
1532 663e8e51 ths
    }
1533 663e8e51 ths
1534 663e8e51 ths
    if (get_ru_state(s) != ru_ready) {
1535 663e8e51 ths
        /* No ressources available. */
1536 663e8e51 ths
        logout("no ressources, state=%u\n", get_ru_state(s));
1537 663e8e51 ths
        s->statistics.rx_resource_errors++;
1538 663e8e51 ths
        //~ assert(!"no ressources");
1539 663e8e51 ths
        return;
1540 663e8e51 ths
    }
1541 663e8e51 ths
    //~ !!!
1542 663e8e51 ths
//~ $3 = {status = 0x0, command = 0xc000, link = 0x2d220, rx_buf_addr = 0x207dc, count = 0x0, size = 0x5f8, packet = {0x0 <repeats 1518 times>}}
1543 663e8e51 ths
    eepro100_rx_t rx;
1544 663e8e51 ths
    cpu_physical_memory_read(s->ru_base + s->ru_offset, (uint8_t *) & rx,
1545 663e8e51 ths
                             offsetof(eepro100_rx_t, packet));
1546 663e8e51 ths
    uint16_t rfd_command = le16_to_cpu(rx.command);
1547 663e8e51 ths
    uint16_t rfd_size = le16_to_cpu(rx.size);
1548 663e8e51 ths
    assert(size <= rfd_size);
1549 663e8e51 ths
    if (size < 64) {
1550 663e8e51 ths
        rfd_status |= 0x0080;
1551 663e8e51 ths
    }
1552 663e8e51 ths
    logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n", rfd_command,
1553 663e8e51 ths
           rx.link, rx.rx_buf_addr, rfd_size);
1554 663e8e51 ths
    stw_phys(s->ru_base + s->ru_offset + offsetof(eepro100_rx_t, status),
1555 663e8e51 ths
             rfd_status);
1556 663e8e51 ths
    stw_phys(s->ru_base + s->ru_offset + offsetof(eepro100_rx_t, count), size);
1557 663e8e51 ths
    /* Early receive interrupt not supported. */
1558 663e8e51 ths
    //~ eepro100_er_interrupt(s);
1559 663e8e51 ths
    /* Receive CRC Transfer not supported. */
1560 663e8e51 ths
    assert(!(s->configuration[18] & 4));
1561 663e8e51 ths
    /* TODO: check stripping enable bit. */
1562 663e8e51 ths
    //~ assert(!(s->configuration[17] & 1));
1563 663e8e51 ths
    cpu_physical_memory_write(s->ru_base + s->ru_offset +
1564 663e8e51 ths
                              offsetof(eepro100_rx_t, packet), buf, size);
1565 663e8e51 ths
    s->statistics.rx_good_frames++;
1566 663e8e51 ths
    eepro100_fr_interrupt(s);
1567 663e8e51 ths
    s->ru_offset = le32_to_cpu(rx.link);
1568 663e8e51 ths
    if (rfd_command & 0x8000) {
1569 663e8e51 ths
        /* EL bit is set, so this was the last frame. */
1570 663e8e51 ths
        assert(0);
1571 663e8e51 ths
    }
1572 663e8e51 ths
    if (rfd_command & 0x4000) {
1573 663e8e51 ths
        /* S bit is set. */
1574 663e8e51 ths
        set_ru_state(s, ru_suspended);
1575 663e8e51 ths
    }
1576 663e8e51 ths
}
1577 663e8e51 ths
1578 663e8e51 ths
static int nic_load(QEMUFile * f, void *opaque, int version_id)
1579 663e8e51 ths
{
1580 663e8e51 ths
    EEPRO100State *s = (EEPRO100State *) opaque;
1581 2657c663 balrog
    int i;
1582 663e8e51 ths
    int ret;
1583 663e8e51 ths
1584 663e8e51 ths
    if (version_id > 3)
1585 663e8e51 ths
        return -EINVAL;
1586 663e8e51 ths
1587 663e8e51 ths
    if (s->pci_dev && version_id >= 3) {
1588 663e8e51 ths
        ret = pci_device_load(s->pci_dev, f);
1589 663e8e51 ths
        if (ret < 0)
1590 663e8e51 ths
            return ret;
1591 663e8e51 ths
    }
1592 663e8e51 ths
1593 663e8e51 ths
    if (version_id >= 2) {
1594 663e8e51 ths
        qemu_get_8s(f, &s->rxcr);
1595 663e8e51 ths
    } else {
1596 663e8e51 ths
        s->rxcr = 0x0c;
1597 663e8e51 ths
    }
1598 663e8e51 ths
1599 663e8e51 ths
    qemu_get_8s(f, &s->cmd);
1600 663e8e51 ths
    qemu_get_be32s(f, &s->start);
1601 663e8e51 ths
    qemu_get_be32s(f, &s->stop);
1602 663e8e51 ths
    qemu_get_8s(f, &s->boundary);
1603 663e8e51 ths
    qemu_get_8s(f, &s->tsr);
1604 663e8e51 ths
    qemu_get_8s(f, &s->tpsr);
1605 663e8e51 ths
    qemu_get_be16s(f, &s->tcnt);
1606 663e8e51 ths
    qemu_get_be16s(f, &s->rcnt);
1607 663e8e51 ths
    qemu_get_be32s(f, &s->rsar);
1608 663e8e51 ths
    qemu_get_8s(f, &s->rsr);
1609 663e8e51 ths
    qemu_get_8s(f, &s->isr);
1610 663e8e51 ths
    qemu_get_8s(f, &s->dcfg);
1611 663e8e51 ths
    qemu_get_8s(f, &s->imr);
1612 663e8e51 ths
    qemu_get_buffer(f, s->phys, 6);
1613 663e8e51 ths
    qemu_get_8s(f, &s->curpag);
1614 663e8e51 ths
    qemu_get_buffer(f, s->mult, 8);
1615 663e8e51 ths
    qemu_get_buffer(f, s->mem, sizeof(s->mem));
1616 663e8e51 ths
1617 2657c663 balrog
    /* Restore all members of struct between scv_stat and mem */
1618 2657c663 balrog
    qemu_get_8s(f, &s->scb_stat);
1619 2657c663 balrog
    qemu_get_8s(f, &s->int_stat);
1620 2657c663 balrog
    for (i = 0; i < 3; i++)
1621 2657c663 balrog
        qemu_get_be32s(f, &s->region[i]);
1622 2657c663 balrog
    qemu_get_buffer(f, s->macaddr, 6);
1623 5fafdf24 ths
    for (i = 0; i < 19; i++)
1624 2657c663 balrog
        qemu_get_be32s(f, &s->statcounter[i]);
1625 2657c663 balrog
    for (i = 0; i < 32; i++)
1626 2657c663 balrog
        qemu_get_be16s(f, &s->mdimem[i]);
1627 2657c663 balrog
    /* The eeprom should be saved and restored by its own routines */
1628 2657c663 balrog
    qemu_get_be32s(f, &s->device);
1629 2657c663 balrog
    qemu_get_be32s(f, &s->pointer);
1630 2657c663 balrog
    qemu_get_be32s(f, &s->cu_base);
1631 2657c663 balrog
    qemu_get_be32s(f, &s->cu_offset);
1632 2657c663 balrog
    qemu_get_be32s(f, &s->ru_base);
1633 2657c663 balrog
    qemu_get_be32s(f, &s->ru_offset);
1634 2657c663 balrog
    qemu_get_be32s(f, &s->statsaddr);
1635 2657c663 balrog
    /* Restore epro100_stats_t statistics */
1636 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_good_frames);
1637 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_max_collisions);
1638 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_late_collisions);
1639 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_underruns);
1640 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_lost_crs);
1641 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_deferred);
1642 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_single_collisions);
1643 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_multiple_collisions);
1644 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.tx_total_collisions);
1645 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_good_frames);
1646 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_crc_errors);
1647 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_alignment_errors);
1648 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_resource_errors);
1649 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_overrun_errors);
1650 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_cdt_errors);
1651 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.rx_short_frame_errors);
1652 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.fc_xmt_pause);
1653 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.fc_rcv_pause);
1654 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.fc_rcv_unsupported);
1655 2657c663 balrog
    qemu_get_be16s(f, &s->statistics.xmt_tco_frames);
1656 2657c663 balrog
    qemu_get_be16s(f, &s->statistics.rcv_tco_frames);
1657 2657c663 balrog
    qemu_get_be32s(f, &s->statistics.complete);
1658 2657c663 balrog
#if 0
1659 2657c663 balrog
    qemu_get_be16s(f, &s->status);
1660 2657c663 balrog
#endif
1661 2657c663 balrog
1662 2657c663 balrog
    /* Configuration bytes. */
1663 2657c663 balrog
    qemu_get_buffer(f, s->configuration, sizeof(s->configuration));
1664 2657c663 balrog
1665 663e8e51 ths
    return 0;
1666 663e8e51 ths
}
1667 663e8e51 ths
1668 663e8e51 ths
static void nic_save(QEMUFile * f, void *opaque)
1669 663e8e51 ths
{
1670 663e8e51 ths
    EEPRO100State *s = (EEPRO100State *) opaque;
1671 2657c663 balrog
    int i;
1672 663e8e51 ths
1673 663e8e51 ths
    if (s->pci_dev)
1674 663e8e51 ths
        pci_device_save(s->pci_dev, f);
1675 663e8e51 ths
1676 663e8e51 ths
    qemu_put_8s(f, &s->rxcr);
1677 663e8e51 ths
1678 663e8e51 ths
    qemu_put_8s(f, &s->cmd);
1679 663e8e51 ths
    qemu_put_be32s(f, &s->start);
1680 663e8e51 ths
    qemu_put_be32s(f, &s->stop);
1681 663e8e51 ths
    qemu_put_8s(f, &s->boundary);
1682 663e8e51 ths
    qemu_put_8s(f, &s->tsr);
1683 663e8e51 ths
    qemu_put_8s(f, &s->tpsr);
1684 663e8e51 ths
    qemu_put_be16s(f, &s->tcnt);
1685 663e8e51 ths
    qemu_put_be16s(f, &s->rcnt);
1686 663e8e51 ths
    qemu_put_be32s(f, &s->rsar);
1687 663e8e51 ths
    qemu_put_8s(f, &s->rsr);
1688 663e8e51 ths
    qemu_put_8s(f, &s->isr);
1689 663e8e51 ths
    qemu_put_8s(f, &s->dcfg);
1690 663e8e51 ths
    qemu_put_8s(f, &s->imr);
1691 663e8e51 ths
    qemu_put_buffer(f, s->phys, 6);
1692 663e8e51 ths
    qemu_put_8s(f, &s->curpag);
1693 663e8e51 ths
    qemu_put_buffer(f, s->mult, 8);
1694 663e8e51 ths
    qemu_put_buffer(f, s->mem, sizeof(s->mem));
1695 2657c663 balrog
1696 2657c663 balrog
    /* Save all members of struct between scv_stat and mem */
1697 2657c663 balrog
    qemu_put_8s(f, &s->scb_stat);
1698 2657c663 balrog
    qemu_put_8s(f, &s->int_stat);
1699 2657c663 balrog
    for (i = 0; i < 3; i++)
1700 2657c663 balrog
        qemu_put_be32s(f, &s->region[i]);
1701 2657c663 balrog
    qemu_put_buffer(f, s->macaddr, 6);
1702 5fafdf24 ths
    for (i = 0; i < 19; i++)
1703 2657c663 balrog
        qemu_put_be32s(f, &s->statcounter[i]);
1704 2657c663 balrog
    for (i = 0; i < 32; i++)
1705 2657c663 balrog
        qemu_put_be16s(f, &s->mdimem[i]);
1706 2657c663 balrog
    /* The eeprom should be saved and restored by its own routines */
1707 2657c663 balrog
    qemu_put_be32s(f, &s->device);
1708 2657c663 balrog
    qemu_put_be32s(f, &s->pointer);
1709 2657c663 balrog
    qemu_put_be32s(f, &s->cu_base);
1710 2657c663 balrog
    qemu_put_be32s(f, &s->cu_offset);
1711 2657c663 balrog
    qemu_put_be32s(f, &s->ru_base);
1712 2657c663 balrog
    qemu_put_be32s(f, &s->ru_offset);
1713 2657c663 balrog
    qemu_put_be32s(f, &s->statsaddr);
1714 2657c663 balrog
    /* Save epro100_stats_t statistics */
1715 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_good_frames);
1716 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_max_collisions);
1717 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_late_collisions);
1718 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_underruns);
1719 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_lost_crs);
1720 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_deferred);
1721 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_single_collisions);
1722 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_multiple_collisions);
1723 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.tx_total_collisions);
1724 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_good_frames);
1725 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_crc_errors);
1726 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_alignment_errors);
1727 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_resource_errors);
1728 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_overrun_errors);
1729 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_cdt_errors);
1730 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.rx_short_frame_errors);
1731 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.fc_xmt_pause);
1732 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.fc_rcv_pause);
1733 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.fc_rcv_unsupported);
1734 2657c663 balrog
    qemu_put_be16s(f, &s->statistics.xmt_tco_frames);
1735 2657c663 balrog
    qemu_put_be16s(f, &s->statistics.rcv_tco_frames);
1736 2657c663 balrog
    qemu_put_be32s(f, &s->statistics.complete);
1737 2657c663 balrog
#if 0
1738 2657c663 balrog
    qemu_put_be16s(f, &s->status);
1739 2657c663 balrog
#endif
1740 2657c663 balrog
1741 2657c663 balrog
    /* Configuration bytes. */
1742 2657c663 balrog
    qemu_put_buffer(f, s->configuration, sizeof(s->configuration));
1743 663e8e51 ths
}
1744 663e8e51 ths
1745 663e8e51 ths
static void nic_init(PCIBus * bus, NICInfo * nd,
1746 663e8e51 ths
                     const char *name, uint32_t device)
1747 663e8e51 ths
{
1748 663e8e51 ths
    PCIEEPRO100State *d;
1749 663e8e51 ths
    EEPRO100State *s;
1750 663e8e51 ths
1751 663e8e51 ths
    logout("\n");
1752 663e8e51 ths
1753 663e8e51 ths
    d = (PCIEEPRO100State *) pci_register_device(bus, name,
1754 663e8e51 ths
                                                 sizeof(PCIEEPRO100State), -1,
1755 663e8e51 ths
                                                 NULL, NULL);
1756 663e8e51 ths
1757 663e8e51 ths
    s = &d->eepro100;
1758 663e8e51 ths
    s->device = device;
1759 663e8e51 ths
    s->pci_dev = &d->dev;
1760 663e8e51 ths
1761 663e8e51 ths
    pci_reset(s);
1762 663e8e51 ths
1763 663e8e51 ths
    /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
1764 663e8e51 ths
     * i82559 and later support 64 or 256 word EEPROM. */
1765 663e8e51 ths
    s->eeprom = eeprom93xx_new(EEPROM_SIZE);
1766 663e8e51 ths
1767 663e8e51 ths
    /* Handler for memory-mapped I/O */
1768 663e8e51 ths
    d->eepro100.mmio_index =
1769 663e8e51 ths
        cpu_register_io_memory(0, pci_mmio_read, pci_mmio_write, s);
1770 663e8e51 ths
1771 663e8e51 ths
    pci_register_io_region(&d->dev, 0, PCI_MEM_SIZE,
1772 663e8e51 ths
                           PCI_ADDRESS_SPACE_MEM |
1773 663e8e51 ths
                           PCI_ADDRESS_SPACE_MEM_PREFETCH, pci_mmio_map);
1774 663e8e51 ths
    pci_register_io_region(&d->dev, 1, PCI_IO_SIZE, PCI_ADDRESS_SPACE_IO,
1775 663e8e51 ths
                           pci_map);
1776 663e8e51 ths
    pci_register_io_region(&d->dev, 2, PCI_FLASH_SIZE, PCI_ADDRESS_SPACE_MEM,
1777 663e8e51 ths
                           pci_mmio_map);
1778 663e8e51 ths
1779 663e8e51 ths
    memcpy(s->macaddr, nd->macaddr, 6);
1780 663e8e51 ths
    logout("macaddr: %s\n", nic_dump(&s->macaddr[0], 6));
1781 663e8e51 ths
    assert(s->region[1] == 0);
1782 663e8e51 ths
1783 663e8e51 ths
    nic_reset(s);
1784 663e8e51 ths
1785 663e8e51 ths
    s->vc = qemu_new_vlan_client(nd->vlan, nic_receive, nic_can_receive, s);
1786 663e8e51 ths
1787 663e8e51 ths
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1788 663e8e51 ths
             "eepro100 pci macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
1789 663e8e51 ths
             s->macaddr[0],
1790 663e8e51 ths
             s->macaddr[1],
1791 663e8e51 ths
             s->macaddr[2], s->macaddr[3], s->macaddr[4], s->macaddr[5]);
1792 663e8e51 ths
1793 663e8e51 ths
    qemu_register_reset(nic_reset, s);
1794 663e8e51 ths
1795 663e8e51 ths
    /* XXX: instance number ? */
1796 663e8e51 ths
    register_savevm(name, 0, 3, nic_save, nic_load, s);
1797 663e8e51 ths
}
1798 663e8e51 ths
1799 663e8e51 ths
void pci_i82551_init(PCIBus * bus, NICInfo * nd, int devfn)
1800 663e8e51 ths
{
1801 663e8e51 ths
    nic_init(bus, nd, "i82551", i82551);
1802 663e8e51 ths
    //~ uint8_t *pci_conf = d->dev.config;
1803 663e8e51 ths
}
1804 663e8e51 ths
1805 663e8e51 ths
void pci_i82557b_init(PCIBus * bus, NICInfo * nd, int devfn)
1806 663e8e51 ths
{
1807 663e8e51 ths
    nic_init(bus, nd, "i82557b", i82557B);
1808 663e8e51 ths
}
1809 663e8e51 ths
1810 663e8e51 ths
void pci_i82559er_init(PCIBus * bus, NICInfo * nd, int devfn)
1811 663e8e51 ths
{
1812 663e8e51 ths
    nic_init(bus, nd, "i82559er", i82559ER);
1813 663e8e51 ths
}
1814 663e8e51 ths
1815 663e8e51 ths
/* eof */