Statistics
| Branch: | Revision:

root / hw / eepro100.c @ 28c5af54

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

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