Statistics
| Branch: | Revision:

root / hw / eepro100.c @ d60efc6b

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

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