Statistics
| Branch: | Revision:

root / hw / e1000.c @ a08d4367

History | View | Annotate | Download (35.6 kB)

1
/*
2
 * QEMU e1000 emulation
3
 *
4
 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
5
 * Copyright (c) 2008 Qumranet
6
 * Based on work done by:
7
 * Copyright (c) 2007 Dan Aloni
8
 * Copyright (c) 2004 Antony T Curtis
9
 *
10
 * This library is free software; you can redistribute it and/or
11
 * modify it under the terms of the GNU Lesser General Public
12
 * License as published by the Free Software Foundation; either
13
 * version 2 of the License, or (at your option) any later version.
14
 *
15
 * This library is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18
 * Lesser General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Lesser General Public
21
 * License along with this library; if not, write to the Free Software
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
23
 */
24

    
25

    
26
#include "hw.h"
27
#include "pci.h"
28
#include "net.h"
29

    
30
#include "e1000_hw.h"
31

    
32
#define DEBUG
33

    
34
#ifdef DEBUG
35
enum {
36
    DEBUG_GENERAL,        DEBUG_IO,        DEBUG_MMIO,        DEBUG_INTERRUPT,
37
    DEBUG_RX,                DEBUG_TX,        DEBUG_MDIC,        DEBUG_EEPROM,
38
    DEBUG_UNKNOWN,        DEBUG_TXSUM,        DEBUG_TXERR,        DEBUG_RXERR,
39
    DEBUG_RXFILTER,        DEBUG_NOTYET,
40
};
41
#define DBGBIT(x)        (1<<DEBUG_##x)
42
static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
43

    
44
#define        DBGOUT(what, fmt, ...) do { \
45
    if (debugflags & DBGBIT(what)) \
46
        fprintf(stderr, "e1000: " fmt, ## __VA_ARGS__); \
47
    } while (0)
48
#else
49
#define        DBGOUT(what, fmt, ...) do {} while (0)
50
#endif
51

    
52
#define IOPORT_SIZE       0x40
53
#define PNPMMIO_SIZE      0x20000
54

    
55
/*
56
 * HW models:
57
 *  E1000_DEV_ID_82540EM works with Windows and Linux
58
 *  E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
59
 *        appears to perform better than 82540EM, but breaks with Linux 2.6.18
60
 *  E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
61
 *  Others never tested
62
 */
63
enum { E1000_DEVID = E1000_DEV_ID_82540EM };
64

    
65
/*
66
 * May need to specify additional MAC-to-PHY entries --
67
 * Intel's Windows driver refuses to initialize unless they match
68
 */
69
enum {
70
    PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ?                0xcc2 :
71
                   E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ?        0xc30 :
72
                   /* default to E1000_DEV_ID_82540EM */        0xc20
73
};
74

    
75
typedef struct E1000State_st {
76
    PCIDevice dev;
77
    VLANClientState *vc;
78
    int mmio_index;
79

    
80
    uint32_t mac_reg[0x8000];
81
    uint16_t phy_reg[0x20];
82
    uint16_t eeprom_data[64];
83

    
84
    uint32_t rxbuf_size;
85
    uint32_t rxbuf_min_shift;
86
    int check_rxov;
87
    struct e1000_tx {
88
        unsigned char header[256];
89
        unsigned char vlan_header[4];
90
        unsigned char vlan[4];
91
        unsigned char data[0x10000];
92
        uint16_t size;
93
        unsigned char sum_needed;
94
        unsigned char vlan_needed;
95
        uint8_t ipcss;
96
        uint8_t ipcso;
97
        uint16_t ipcse;
98
        uint8_t tucss;
99
        uint8_t tucso;
100
        uint16_t tucse;
101
        uint8_t hdr_len;
102
        uint16_t mss;
103
        uint32_t paylen;
104
        uint16_t tso_frames;
105
        char tse;
106
        int8_t ip;
107
        int8_t tcp;
108
        char cptse;     // current packet tse bit
109
    } tx;
110

    
111
    struct {
112
        uint32_t val_in;        // shifted in from guest driver
113
        uint16_t bitnum_in;
114
        uint16_t bitnum_out;
115
        uint16_t reading;
116
        uint32_t old_eecd;
117
    } eecd_state;
118
} E1000State;
119

    
120
#define        defreg(x)        x = (E1000_##x>>2)
121
enum {
122
    defreg(CTRL),        defreg(EECD),        defreg(EERD),        defreg(GPRC),
123
    defreg(GPTC),        defreg(ICR),        defreg(ICS),        defreg(IMC),
124
    defreg(IMS),        defreg(LEDCTL),        defreg(MANC),        defreg(MDIC),
125
    defreg(MPC),        defreg(PBA),        defreg(RCTL),        defreg(RDBAH),
126
    defreg(RDBAL),        defreg(RDH),        defreg(RDLEN),        defreg(RDT),
127
    defreg(STATUS),        defreg(SWSM),        defreg(TCTL),        defreg(TDBAH),
128
    defreg(TDBAL),        defreg(TDH),        defreg(TDLEN),        defreg(TDT),
129
    defreg(TORH),        defreg(TORL),        defreg(TOTH),        defreg(TOTL),
130
    defreg(TPR),        defreg(TPT),        defreg(TXDCTL),        defreg(WUFC),
131
    defreg(RA),                defreg(MTA),        defreg(CRCERRS),defreg(VFTA),
132
    defreg(VET),
133
};
134

    
135
enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
136
static const char phy_regcap[0x20] = {
137
    [PHY_STATUS] = PHY_R,        [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
138
    [PHY_ID1] = PHY_R,                [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
139
    [PHY_CTRL] = PHY_RW,        [PHY_1000T_CTRL] = PHY_RW,
140
    [PHY_LP_ABILITY] = PHY_R,        [PHY_1000T_STATUS] = PHY_R,
141
    [PHY_AUTONEG_ADV] = PHY_RW,        [M88E1000_RX_ERR_CNTR] = PHY_R,
142
    [PHY_ID2] = PHY_R,                [M88E1000_PHY_SPEC_STATUS] = PHY_R
143
};
144

    
145
static void
146
ioport_map(PCIDevice *pci_dev, int region_num, uint32_t addr,
147
           uint32_t size, int type)
148
{
149
    DBGOUT(IO, "e1000_ioport_map addr=0x%04x size=0x%08x\n", addr, size);
150
}
151

    
152
static void
153
set_interrupt_cause(E1000State *s, int index, uint32_t val)
154
{
155
    if (val)
156
        val |= E1000_ICR_INT_ASSERTED;
157
    s->mac_reg[ICR] = val;
158
    qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
159
}
160

    
161
static void
162
set_ics(E1000State *s, int index, uint32_t val)
163
{
164
    DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
165
        s->mac_reg[IMS]);
166
    set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
167
}
168

    
169
static int
170
rxbufsize(uint32_t v)
171
{
172
    v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
173
         E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
174
         E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
175
    switch (v) {
176
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
177
        return 16384;
178
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
179
        return 8192;
180
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
181
        return 4096;
182
    case E1000_RCTL_SZ_1024:
183
        return 1024;
184
    case E1000_RCTL_SZ_512:
185
        return 512;
186
    case E1000_RCTL_SZ_256:
187
        return 256;
188
    }
189
    return 2048;
190
}
191

    
192
static void
193
set_ctrl(E1000State *s, int index, uint32_t val)
194
{
195
    /* RST is self clearing */
196
    s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
197
}
198

    
199
static void
200
set_rx_control(E1000State *s, int index, uint32_t val)
201
{
202
    s->mac_reg[RCTL] = val;
203
    s->rxbuf_size = rxbufsize(val);
204
    s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
205
    DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
206
           s->mac_reg[RCTL]);
207
}
208

    
209
static void
210
set_mdic(E1000State *s, int index, uint32_t val)
211
{
212
    uint32_t data = val & E1000_MDIC_DATA_MASK;
213
    uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
214

    
215
    if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
216
        val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
217
    else if (val & E1000_MDIC_OP_READ) {
218
        DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
219
        if (!(phy_regcap[addr] & PHY_R)) {
220
            DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
221
            val |= E1000_MDIC_ERROR;
222
        } else
223
            val = (val ^ data) | s->phy_reg[addr];
224
    } else if (val & E1000_MDIC_OP_WRITE) {
225
        DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
226
        if (!(phy_regcap[addr] & PHY_W)) {
227
            DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
228
            val |= E1000_MDIC_ERROR;
229
        } else
230
            s->phy_reg[addr] = data;
231
    }
232
    s->mac_reg[MDIC] = val | E1000_MDIC_READY;
233
    set_ics(s, 0, E1000_ICR_MDAC);
234
}
235

    
236
static uint32_t
237
get_eecd(E1000State *s, int index)
238
{
239
    uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
240

    
241
    DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
242
           s->eecd_state.bitnum_out, s->eecd_state.reading);
243
    if (!s->eecd_state.reading ||
244
        ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
245
          ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
246
        ret |= E1000_EECD_DO;
247
    return ret;
248
}
249

    
250
static void
251
set_eecd(E1000State *s, int index, uint32_t val)
252
{
253
    uint32_t oldval = s->eecd_state.old_eecd;
254

    
255
    s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
256
            E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
257
    if (!(E1000_EECD_SK & (val ^ oldval)))        // no clock edge
258
        return;
259
    if (!(E1000_EECD_SK & val)) {                // falling edge
260
        s->eecd_state.bitnum_out++;
261
        return;
262
    }
263
    if (!(val & E1000_EECD_CS)) {                // rising, no CS (EEPROM reset)
264
        memset(&s->eecd_state, 0, sizeof s->eecd_state);
265
        return;
266
    }
267
    s->eecd_state.val_in <<= 1;
268
    if (val & E1000_EECD_DI)
269
        s->eecd_state.val_in |= 1;
270
    if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
271
        s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
272
        s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
273
            EEPROM_READ_OPCODE_MICROWIRE);
274
    }
275
    DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
276
           s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
277
           s->eecd_state.reading);
278
}
279

    
280
static uint32_t
281
flash_eerd_read(E1000State *s, int x)
282
{
283
    unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
284

    
285
    if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
286
        return 0;
287
    return (s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
288
           E1000_EEPROM_RW_REG_DONE | r;
289
}
290

    
291
static void
292
putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
293
{
294
    uint32_t sum;
295

    
296
    if (cse && cse < n)
297
        n = cse + 1;
298
    if (sloc < n-1) {
299
        sum = net_checksum_add(n-css, data+css);
300
        cpu_to_be16wu((uint16_t *)(data + sloc),
301
                      net_checksum_finish(sum));
302
    }
303
}
304

    
305
static inline int
306
vlan_enabled(E1000State *s)
307
{
308
    return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
309
}
310

    
311
static inline int
312
vlan_rx_filter_enabled(E1000State *s)
313
{
314
    return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
315
}
316

    
317
static inline int
318
is_vlan_packet(E1000State *s, const uint8_t *buf)
319
{
320
    return (be16_to_cpup((uint16_t *)(buf + 12)) ==
321
                le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
322
}
323

    
324
static inline int
325
is_vlan_txd(uint32_t txd_lower)
326
{
327
    return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
328
}
329

    
330
static void
331
xmit_seg(E1000State *s)
332
{
333
    uint16_t len, *sp;
334
    unsigned int frames = s->tx.tso_frames, css, sofar, n;
335
    struct e1000_tx *tp = &s->tx;
336

    
337
    if (tp->tse && tp->cptse) {
338
        css = tp->ipcss;
339
        DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
340
               frames, tp->size, css);
341
        if (tp->ip) {                // IPv4
342
            cpu_to_be16wu((uint16_t *)(tp->data+css+2),
343
                          tp->size - css);
344
            cpu_to_be16wu((uint16_t *)(tp->data+css+4),
345
                          be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
346
        } else                        // IPv6
347
            cpu_to_be16wu((uint16_t *)(tp->data+css+4),
348
                          tp->size - css);
349
        css = tp->tucss;
350
        len = tp->size - css;
351
        DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
352
        if (tp->tcp) {
353
            sofar = frames * tp->mss;
354
            cpu_to_be32wu((uint32_t *)(tp->data+css+4),        // seq
355
                be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
356
            if (tp->paylen - sofar > tp->mss)
357
                tp->data[css + 13] &= ~9;                // PSH, FIN
358
        } else        // UDP
359
            cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
360
        if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
361
            // add pseudo-header length before checksum calculation
362
            sp = (uint16_t *)(tp->data + tp->tucso);
363
            cpu_to_be16wu(sp, be16_to_cpup(sp) + len);
364
        }
365
        tp->tso_frames++;
366
    }
367

    
368
    if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
369
        putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
370
    if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
371
        putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
372
    if (tp->vlan_needed) {
373
        memmove(tp->vlan, tp->data, 12);
374
        memcpy(tp->data + 8, tp->vlan_header, 4);
375
        qemu_send_packet(s->vc, tp->vlan, tp->size + 4);
376
    } else
377
        qemu_send_packet(s->vc, tp->data, tp->size);
378
    s->mac_reg[TPT]++;
379
    s->mac_reg[GPTC]++;
380
    n = s->mac_reg[TOTL];
381
    if ((s->mac_reg[TOTL] += s->tx.size) < n)
382
        s->mac_reg[TOTH]++;
383
}
384

    
385
static void
386
process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
387
{
388
    uint32_t txd_lower = le32_to_cpu(dp->lower.data);
389
    uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
390
    unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
391
    unsigned int msh = 0xfffff, hdr = 0;
392
    uint64_t addr;
393
    struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
394
    struct e1000_tx *tp = &s->tx;
395

    
396
    if (dtype == E1000_TXD_CMD_DEXT) {        // context descriptor
397
        op = le32_to_cpu(xp->cmd_and_length);
398
        tp->ipcss = xp->lower_setup.ip_fields.ipcss;
399
        tp->ipcso = xp->lower_setup.ip_fields.ipcso;
400
        tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
401
        tp->tucss = xp->upper_setup.tcp_fields.tucss;
402
        tp->tucso = xp->upper_setup.tcp_fields.tucso;
403
        tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
404
        tp->paylen = op & 0xfffff;
405
        tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
406
        tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
407
        tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
408
        tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
409
        tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
410
        tp->tso_frames = 0;
411
        if (tp->tucso == 0) {        // this is probably wrong
412
            DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
413
            tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
414
        }
415
        return;
416
    } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
417
        // data descriptor
418
        tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
419
        tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
420
    } else
421
        // legacy descriptor
422
        tp->cptse = 0;
423

    
424
    if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
425
        (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
426
        tp->vlan_needed = 1;
427
        cpu_to_be16wu((uint16_t *)(tp->vlan_header),
428
                      le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
429
        cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
430
                      le16_to_cpu(dp->upper.fields.special));
431
    }
432
        
433
    addr = le64_to_cpu(dp->buffer_addr);
434
    if (tp->tse && tp->cptse) {
435
        hdr = tp->hdr_len;
436
        msh = hdr + tp->mss;
437
        do {
438
            bytes = split_size;
439
            if (tp->size + bytes > msh)
440
                bytes = msh - tp->size;
441
            cpu_physical_memory_read(addr, tp->data + tp->size, bytes);
442
            if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
443
                memmove(tp->header, tp->data, hdr);
444
            tp->size = sz;
445
            addr += bytes;
446
            if (sz == msh) {
447
                xmit_seg(s);
448
                memmove(tp->data, tp->header, hdr);
449
                tp->size = hdr;
450
            }
451
        } while (split_size -= bytes);
452
    } else if (!tp->tse && tp->cptse) {
453
        // context descriptor TSE is not set, while data descriptor TSE is set
454
        DBGOUT(TXERR, "TCP segmentaion Error\n");
455
    } else {
456
        cpu_physical_memory_read(addr, tp->data + tp->size, split_size);
457
        tp->size += split_size;
458
    }
459

    
460
    if (!(txd_lower & E1000_TXD_CMD_EOP))
461
        return;
462
    if (!(tp->tse && tp->cptse && tp->size < hdr))
463
        xmit_seg(s);
464
    tp->tso_frames = 0;
465
    tp->sum_needed = 0;
466
    tp->vlan_needed = 0;
467
    tp->size = 0;
468
    tp->cptse = 0;
469
}
470

    
471
static uint32_t
472
txdesc_writeback(target_phys_addr_t base, struct e1000_tx_desc *dp)
473
{
474
    uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
475

    
476
    if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
477
        return 0;
478
    txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
479
                ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
480
    dp->upper.data = cpu_to_le32(txd_upper);
481
    cpu_physical_memory_write(base + ((char *)&dp->upper - (char *)dp),
482
                              (void *)&dp->upper, sizeof(dp->upper));
483
    return E1000_ICR_TXDW;
484
}
485

    
486
static void
487
start_xmit(E1000State *s)
488
{
489
    target_phys_addr_t base;
490
    struct e1000_tx_desc desc;
491
    uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
492

    
493
    if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
494
        DBGOUT(TX, "tx disabled\n");
495
        return;
496
    }
497

    
498
    while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
499
        base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
500
               sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
501
        cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
502

    
503
        DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
504
               (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
505
               desc.upper.data);
506

    
507
        process_tx_desc(s, &desc);
508
        cause |= txdesc_writeback(base, &desc);
509

    
510
        if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
511
            s->mac_reg[TDH] = 0;
512
        /*
513
         * the following could happen only if guest sw assigns
514
         * bogus values to TDT/TDLEN.
515
         * there's nothing too intelligent we could do about this.
516
         */
517
        if (s->mac_reg[TDH] == tdh_start) {
518
            DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
519
                   tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
520
            break;
521
        }
522
    }
523
    set_ics(s, 0, cause);
524
}
525

    
526
static int
527
receive_filter(E1000State *s, const uint8_t *buf, int size)
528
{
529
    static uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
530
    static int mta_shift[] = {4, 3, 2, 0};
531
    uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
532

    
533
    if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
534
        uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
535
        uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
536
                                     ((vid >> 5) & 0x7f));
537
        if ((vfta & (1 << (vid & 0x1f))) == 0)
538
            return 0;
539
    }
540

    
541
    if (rctl & E1000_RCTL_UPE)                        // promiscuous
542
        return 1;
543

    
544
    if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE))        // promiscuous mcast
545
        return 1;
546

    
547
    if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
548
        return 1;
549

    
550
    for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
551
        if (!(rp[1] & E1000_RAH_AV))
552
            continue;
553
        ra[0] = cpu_to_le32(rp[0]);
554
        ra[1] = cpu_to_le32(rp[1]);
555
        if (!memcmp(buf, (uint8_t *)ra, 6)) {
556
            DBGOUT(RXFILTER,
557
                   "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
558
                   (int)(rp - s->mac_reg - RA)/2,
559
                   buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
560
            return 1;
561
        }
562
    }
563
    DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
564
           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
565

    
566
    f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
567
    f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
568
    if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
569
        return 1;
570
    DBGOUT(RXFILTER,
571
           "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
572
           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
573
           (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
574
           s->mac_reg[MTA + (f >> 5)]);
575

    
576
    return 0;
577
}
578

    
579
static void
580
e1000_set_link_status(VLANClientState *vc)
581
{
582
    E1000State *s = vc->opaque;
583
    uint32_t old_status = s->mac_reg[STATUS];
584

    
585
    if (vc->link_down)
586
        s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
587
    else
588
        s->mac_reg[STATUS] |= E1000_STATUS_LU;
589

    
590
    if (s->mac_reg[STATUS] != old_status)
591
        set_ics(s, 0, E1000_ICR_LSC);
592
}
593

    
594
static int
595
e1000_can_receive(VLANClientState *vc)
596
{
597
    E1000State *s = vc->opaque;
598

    
599
    return (s->mac_reg[RCTL] & E1000_RCTL_EN);
600
}
601

    
602
static ssize_t
603
e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
604
{
605
    E1000State *s = vc->opaque;
606
    struct e1000_rx_desc desc;
607
    target_phys_addr_t base;
608
    unsigned int n, rdt;
609
    uint32_t rdh_start;
610
    uint16_t vlan_special = 0;
611
    uint8_t vlan_status = 0, vlan_offset = 0;
612

    
613
    if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
614
        return -1;
615

    
616
    if (size > s->rxbuf_size) {
617
        DBGOUT(RX, "packet too large for buffers (%lu > %d)\n",
618
               (unsigned long)size, s->rxbuf_size);
619
        return -1;
620
    }
621

    
622
    if (!receive_filter(s, buf, size))
623
        return size;
624

    
625
    if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
626
        vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
627
        memmove((void *)(buf + 4), buf, 12);
628
        vlan_status = E1000_RXD_STAT_VP;
629
        vlan_offset = 4;
630
        size -= 4;
631
    }
632

    
633
    rdh_start = s->mac_reg[RDH];
634
    size += 4; // for the header
635
    do {
636
        if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) {
637
            set_ics(s, 0, E1000_ICS_RXO);
638
            return -1;
639
        }
640
        base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
641
               sizeof(desc) * s->mac_reg[RDH];
642
        cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
643
        desc.special = vlan_special;
644
        desc.status |= (vlan_status | E1000_RXD_STAT_DD);
645
        if (desc.buffer_addr) {
646
            cpu_physical_memory_write(le64_to_cpu(desc.buffer_addr),
647
                                      (void *)(buf + vlan_offset), size);
648
            desc.length = cpu_to_le16(size);
649
            desc.status |= E1000_RXD_STAT_EOP|E1000_RXD_STAT_IXSM;
650
        } else // as per intel docs; skip descriptors with null buf addr
651
            DBGOUT(RX, "Null RX descriptor!!\n");
652
        cpu_physical_memory_write(base, (void *)&desc, sizeof(desc));
653

    
654
        if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
655
            s->mac_reg[RDH] = 0;
656
        s->check_rxov = 1;
657
        /* see comment in start_xmit; same here */
658
        if (s->mac_reg[RDH] == rdh_start) {
659
            DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
660
                   rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
661
            set_ics(s, 0, E1000_ICS_RXO);
662
            return -1;
663
        }
664
    } while (desc.buffer_addr == 0);
665

    
666
    s->mac_reg[GPRC]++;
667
    s->mac_reg[TPR]++;
668
    n = s->mac_reg[TORL];
669
    if ((s->mac_reg[TORL] += size) < n)
670
        s->mac_reg[TORH]++;
671

    
672
    n = E1000_ICS_RXT0;
673
    if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
674
        rdt += s->mac_reg[RDLEN] / sizeof(desc);
675
    if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
676
        s->rxbuf_min_shift)
677
        n |= E1000_ICS_RXDMT0;
678

    
679
    set_ics(s, 0, n);
680

    
681
    return size;
682
}
683

    
684
static uint32_t
685
mac_readreg(E1000State *s, int index)
686
{
687
    return s->mac_reg[index];
688
}
689

    
690
static uint32_t
691
mac_icr_read(E1000State *s, int index)
692
{
693
    uint32_t ret = s->mac_reg[ICR];
694

    
695
    DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
696
    set_interrupt_cause(s, 0, 0);
697
    return ret;
698
}
699

    
700
static uint32_t
701
mac_read_clr4(E1000State *s, int index)
702
{
703
    uint32_t ret = s->mac_reg[index];
704

    
705
    s->mac_reg[index] = 0;
706
    return ret;
707
}
708

    
709
static uint32_t
710
mac_read_clr8(E1000State *s, int index)
711
{
712
    uint32_t ret = s->mac_reg[index];
713

    
714
    s->mac_reg[index] = 0;
715
    s->mac_reg[index-1] = 0;
716
    return ret;
717
}
718

    
719
static void
720
mac_writereg(E1000State *s, int index, uint32_t val)
721
{
722
    s->mac_reg[index] = val;
723
}
724

    
725
static void
726
set_rdt(E1000State *s, int index, uint32_t val)
727
{
728
    s->check_rxov = 0;
729
    s->mac_reg[index] = val & 0xffff;
730
}
731

    
732
static void
733
set_16bit(E1000State *s, int index, uint32_t val)
734
{
735
    s->mac_reg[index] = val & 0xffff;
736
}
737

    
738
static void
739
set_dlen(E1000State *s, int index, uint32_t val)
740
{
741
    s->mac_reg[index] = val & 0xfff80;
742
}
743

    
744
static void
745
set_tctl(E1000State *s, int index, uint32_t val)
746
{
747
    s->mac_reg[index] = val;
748
    s->mac_reg[TDT] &= 0xffff;
749
    start_xmit(s);
750
}
751

    
752
static void
753
set_icr(E1000State *s, int index, uint32_t val)
754
{
755
    DBGOUT(INTERRUPT, "set_icr %x\n", val);
756
    set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
757
}
758

    
759
static void
760
set_imc(E1000State *s, int index, uint32_t val)
761
{
762
    s->mac_reg[IMS] &= ~val;
763
    set_ics(s, 0, 0);
764
}
765

    
766
static void
767
set_ims(E1000State *s, int index, uint32_t val)
768
{
769
    s->mac_reg[IMS] |= val;
770
    set_ics(s, 0, 0);
771
}
772

    
773
#define getreg(x)        [x] = mac_readreg
774
static uint32_t (*macreg_readops[])(E1000State *, int) = {
775
    getreg(PBA),        getreg(RCTL),        getreg(TDH),        getreg(TXDCTL),
776
    getreg(WUFC),        getreg(TDT),        getreg(CTRL),        getreg(LEDCTL),
777
    getreg(MANC),        getreg(MDIC),        getreg(SWSM),        getreg(STATUS),
778
    getreg(TORL),        getreg(TOTL),        getreg(IMS),        getreg(TCTL),
779
    getreg(RDH),        getreg(RDT),        getreg(VET),
780

    
781
    [TOTH] = mac_read_clr8,        [TORH] = mac_read_clr8,        [GPRC] = mac_read_clr4,
782
    [GPTC] = mac_read_clr4,        [TPR] = mac_read_clr4,        [TPT] = mac_read_clr4,
783
    [ICR] = mac_icr_read,        [EECD] = get_eecd,        [EERD] = flash_eerd_read,
784
    [CRCERRS ... MPC] = &mac_readreg,
785
    [RA ... RA+31] = &mac_readreg,
786
    [MTA ... MTA+127] = &mac_readreg,
787
    [VFTA ... VFTA+127] = &mac_readreg,
788
};
789
enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
790

    
791
#define putreg(x)        [x] = mac_writereg
792
static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
793
    putreg(PBA),        putreg(EERD),        putreg(SWSM),        putreg(WUFC),
794
    putreg(TDBAL),        putreg(TDBAH),        putreg(TXDCTL),        putreg(RDBAH),
795
    putreg(RDBAL),        putreg(LEDCTL), putreg(VET),
796
    [TDLEN] = set_dlen,        [RDLEN] = set_dlen,        [TCTL] = set_tctl,
797
    [TDT] = set_tctl,        [MDIC] = set_mdic,        [ICS] = set_ics,
798
    [TDH] = set_16bit,        [RDH] = set_16bit,        [RDT] = set_rdt,
799
    [IMC] = set_imc,        [IMS] = set_ims,        [ICR] = set_icr,
800
    [EECD] = set_eecd,        [RCTL] = set_rx_control, [CTRL] = set_ctrl,
801
    [RA ... RA+31] = &mac_writereg,
802
    [MTA ... MTA+127] = &mac_writereg,
803
    [VFTA ... VFTA+127] = &mac_writereg,
804
};
805
enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
806

    
807
static void
808
e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
809
{
810
    E1000State *s = opaque;
811
    unsigned int index = (addr & 0x1ffff) >> 2;
812

    
813
#ifdef TARGET_WORDS_BIGENDIAN
814
    val = bswap32(val);
815
#endif
816
    if (index < NWRITEOPS && macreg_writeops[index])
817
        macreg_writeops[index](s, index, val);
818
    else if (index < NREADOPS && macreg_readops[index])
819
        DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04x\n", index<<2, val);
820
    else
821
        DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
822
               index<<2, val);
823
}
824

    
825
static void
826
e1000_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
827
{
828
    // emulate hw without byte enables: no RMW
829
    e1000_mmio_writel(opaque, addr & ~3,
830
                      (val & 0xffff) << (8*(addr & 3)));
831
}
832

    
833
static void
834
e1000_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
835
{
836
    // emulate hw without byte enables: no RMW
837
    e1000_mmio_writel(opaque, addr & ~3,
838
                      (val & 0xff) << (8*(addr & 3)));
839
}
840

    
841
static uint32_t
842
e1000_mmio_readl(void *opaque, target_phys_addr_t addr)
843
{
844
    E1000State *s = opaque;
845
    unsigned int index = (addr & 0x1ffff) >> 2;
846

    
847
    if (index < NREADOPS && macreg_readops[index])
848
    {
849
        uint32_t val = macreg_readops[index](s, index);
850
#ifdef TARGET_WORDS_BIGENDIAN
851
        val = bswap32(val);
852
#endif
853
        return val;
854
    }
855
    DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
856
    return 0;
857
}
858

    
859
static uint32_t
860
e1000_mmio_readb(void *opaque, target_phys_addr_t addr)
861
{
862
    return ((e1000_mmio_readl(opaque, addr & ~3)) >>
863
            (8 * (addr & 3))) & 0xff;
864
}
865

    
866
static uint32_t
867
e1000_mmio_readw(void *opaque, target_phys_addr_t addr)
868
{
869
    return ((e1000_mmio_readl(opaque, addr & ~3)) >>
870
            (8 * (addr & 3))) & 0xffff;
871
}
872

    
873
static const int mac_regtosave[] = {
874
    CTRL,        EECD,        EERD,        GPRC,        GPTC,        ICR,        ICS,        IMC,        IMS,
875
    LEDCTL,        MANC,        MDIC,        MPC,        PBA,        RCTL,        RDBAH,        RDBAL,        RDH,
876
    RDLEN,        RDT,        STATUS,        SWSM,        TCTL,        TDBAH,        TDBAL,        TDH,        TDLEN,
877
    TDT,        TORH,        TORL,        TOTH,        TOTL,        TPR,        TPT,        TXDCTL,        WUFC,
878
    VET,
879
};
880
enum { MAC_NSAVE = ARRAY_SIZE(mac_regtosave) };
881

    
882
static const struct {
883
    int size;
884
    int array0;
885
} mac_regarraystosave[] = { {32, RA}, {128, MTA}, {128, VFTA} };
886
enum { MAC_NARRAYS = ARRAY_SIZE(mac_regarraystosave) };
887

    
888
static void
889
nic_save(QEMUFile *f, void *opaque)
890
{
891
    E1000State *s = (E1000State *)opaque;
892
    int i, j;
893

    
894
    pci_device_save(&s->dev, f);
895
    qemu_put_be32(f, 0);
896
    qemu_put_be32s(f, &s->rxbuf_size);
897
    qemu_put_be32s(f, &s->rxbuf_min_shift);
898
    qemu_put_be32s(f, &s->eecd_state.val_in);
899
    qemu_put_be16s(f, &s->eecd_state.bitnum_in);
900
    qemu_put_be16s(f, &s->eecd_state.bitnum_out);
901
    qemu_put_be16s(f, &s->eecd_state.reading);
902
    qemu_put_be32s(f, &s->eecd_state.old_eecd);
903
    qemu_put_8s(f, &s->tx.ipcss);
904
    qemu_put_8s(f, &s->tx.ipcso);
905
    qemu_put_be16s(f, &s->tx.ipcse);
906
    qemu_put_8s(f, &s->tx.tucss);
907
    qemu_put_8s(f, &s->tx.tucso);
908
    qemu_put_be16s(f, &s->tx.tucse);
909
    qemu_put_be32s(f, &s->tx.paylen);
910
    qemu_put_8s(f, &s->tx.hdr_len);
911
    qemu_put_be16s(f, &s->tx.mss);
912
    qemu_put_be16s(f, &s->tx.size);
913
    qemu_put_be16s(f, &s->tx.tso_frames);
914
    qemu_put_8s(f, &s->tx.sum_needed);
915
    qemu_put_s8s(f, &s->tx.ip);
916
    qemu_put_s8s(f, &s->tx.tcp);
917
    qemu_put_buffer(f, s->tx.header, sizeof s->tx.header);
918
    qemu_put_buffer(f, s->tx.data, sizeof s->tx.data);
919
    for (i = 0; i < 64; i++)
920
        qemu_put_be16s(f, s->eeprom_data + i);
921
    for (i = 0; i < 0x20; i++)
922
        qemu_put_be16s(f, s->phy_reg + i);
923
    for (i = 0; i < MAC_NSAVE; i++)
924
        qemu_put_be32s(f, s->mac_reg + mac_regtosave[i]);
925
    for (i = 0; i < MAC_NARRAYS; i++)
926
        for (j = 0; j < mac_regarraystosave[i].size; j++)
927
            qemu_put_be32s(f,
928
                           s->mac_reg + mac_regarraystosave[i].array0 + j);
929
}
930

    
931
static int
932
nic_load(QEMUFile *f, void *opaque, int version_id)
933
{
934
    E1000State *s = (E1000State *)opaque;
935
    int i, j, ret;
936

    
937
    if ((ret = pci_device_load(&s->dev, f)) < 0)
938
        return ret;
939
    if (version_id == 1)
940
        qemu_get_sbe32s(f, &i); /* once some unused instance id */
941
    qemu_get_be32(f); /* Ignored.  Was mmio_base.  */
942
    qemu_get_be32s(f, &s->rxbuf_size);
943
    qemu_get_be32s(f, &s->rxbuf_min_shift);
944
    qemu_get_be32s(f, &s->eecd_state.val_in);
945
    qemu_get_be16s(f, &s->eecd_state.bitnum_in);
946
    qemu_get_be16s(f, &s->eecd_state.bitnum_out);
947
    qemu_get_be16s(f, &s->eecd_state.reading);
948
    qemu_get_be32s(f, &s->eecd_state.old_eecd);
949
    qemu_get_8s(f, &s->tx.ipcss);
950
    qemu_get_8s(f, &s->tx.ipcso);
951
    qemu_get_be16s(f, &s->tx.ipcse);
952
    qemu_get_8s(f, &s->tx.tucss);
953
    qemu_get_8s(f, &s->tx.tucso);
954
    qemu_get_be16s(f, &s->tx.tucse);
955
    qemu_get_be32s(f, &s->tx.paylen);
956
    qemu_get_8s(f, &s->tx.hdr_len);
957
    qemu_get_be16s(f, &s->tx.mss);
958
    qemu_get_be16s(f, &s->tx.size);
959
    qemu_get_be16s(f, &s->tx.tso_frames);
960
    qemu_get_8s(f, &s->tx.sum_needed);
961
    qemu_get_s8s(f, &s->tx.ip);
962
    qemu_get_s8s(f, &s->tx.tcp);
963
    qemu_get_buffer(f, s->tx.header, sizeof s->tx.header);
964
    qemu_get_buffer(f, s->tx.data, sizeof s->tx.data);
965
    for (i = 0; i < 64; i++)
966
        qemu_get_be16s(f, s->eeprom_data + i);
967
    for (i = 0; i < 0x20; i++)
968
        qemu_get_be16s(f, s->phy_reg + i);
969
    for (i = 0; i < MAC_NSAVE; i++)
970
        qemu_get_be32s(f, s->mac_reg + mac_regtosave[i]);
971
    for (i = 0; i < MAC_NARRAYS; i++)
972
        for (j = 0; j < mac_regarraystosave[i].size; j++)
973
            qemu_get_be32s(f,
974
                           s->mac_reg + mac_regarraystosave[i].array0 + j);
975
    return 0;
976
}
977

    
978
static const uint16_t e1000_eeprom_template[64] = {
979
    0x0000, 0x0000, 0x0000, 0x0000,      0xffff, 0x0000,      0x0000, 0x0000,
980
    0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
981
    0x0008, 0x2000, 0x7e14, 0x0048,      0x1000, 0x00d8,      0x0000, 0x2700,
982
    0x6cc9, 0x3150, 0x0722, 0x040b,      0x0984, 0x0000,      0xc000, 0x0706,
983
    0x1008, 0x0000, 0x0f04, 0x7fff,      0x4d01, 0xffff,      0xffff, 0xffff,
984
    0xffff, 0xffff, 0xffff, 0xffff,      0xffff, 0xffff,      0xffff, 0xffff,
985
    0x0100, 0x4000, 0x121c, 0xffff,      0xffff, 0xffff,      0xffff, 0xffff,
986
    0xffff, 0xffff, 0xffff, 0xffff,      0xffff, 0xffff,      0xffff, 0x0000,
987
};
988

    
989
static const uint16_t phy_reg_init[] = {
990
    [PHY_CTRL] = 0x1140,                        [PHY_STATUS] = 0x796d, // link initially up
991
    [PHY_ID1] = 0x141,                                [PHY_ID2] = PHY_ID2_INIT,
992
    [PHY_1000T_CTRL] = 0x0e00,                        [M88E1000_PHY_SPEC_CTRL] = 0x360,
993
    [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60,        [PHY_AUTONEG_ADV] = 0xde1,
994
    [PHY_LP_ABILITY] = 0x1e0,                        [PHY_1000T_STATUS] = 0x3c00,
995
    [M88E1000_PHY_SPEC_STATUS] = 0xac00,
996
};
997

    
998
static const uint32_t mac_reg_init[] = {
999
    [PBA] =     0x00100030,
1000
    [LEDCTL] =  0x602,
1001
    [CTRL] =    E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
1002
                E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
1003
    [STATUS] =  0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
1004
                E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
1005
                E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
1006
                E1000_STATUS_LU,
1007
    [MANC] =    E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
1008
                E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
1009
                E1000_MANC_RMCP_EN,
1010
};
1011

    
1012
/* PCI interface */
1013

    
1014
static CPUWriteMemoryFunc *e1000_mmio_write[] = {
1015
    e1000_mmio_writeb,        e1000_mmio_writew,        e1000_mmio_writel
1016
};
1017

    
1018
static CPUReadMemoryFunc *e1000_mmio_read[] = {
1019
    e1000_mmio_readb,        e1000_mmio_readw,        e1000_mmio_readl
1020
};
1021

    
1022
static void
1023
e1000_mmio_map(PCIDevice *pci_dev, int region_num,
1024
                uint32_t addr, uint32_t size, int type)
1025
{
1026
    E1000State *d = (E1000State *)pci_dev;
1027
    int i;
1028
    const uint32_t excluded_regs[] = {
1029
        E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
1030
        E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
1031
    };
1032

    
1033

    
1034
    DBGOUT(MMIO, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr, size);
1035

    
1036
    cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index);
1037
    qemu_register_coalesced_mmio(addr, excluded_regs[0]);
1038

    
1039
    for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
1040
        qemu_register_coalesced_mmio(addr + excluded_regs[i] + 4,
1041
                                     excluded_regs[i + 1] -
1042
                                     excluded_regs[i] - 4);
1043
}
1044

    
1045
static void
1046
e1000_cleanup(VLANClientState *vc)
1047
{
1048
    E1000State *d = vc->opaque;
1049

    
1050
    unregister_savevm("e1000", d);
1051
}
1052

    
1053
static int
1054
pci_e1000_uninit(PCIDevice *dev)
1055
{
1056
    E1000State *d = (E1000State *) dev;
1057

    
1058
    cpu_unregister_io_memory(d->mmio_index);
1059

    
1060
    return 0;
1061
}
1062

    
1063
static void e1000_reset(void *opaque)
1064
{
1065
    E1000State *d = opaque;
1066

    
1067
    memset(d->phy_reg, 0, sizeof d->phy_reg);
1068
    memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
1069
    memset(d->mac_reg, 0, sizeof d->mac_reg);
1070
    memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
1071
    d->rxbuf_min_shift = 1;
1072
    memset(&d->tx, 0, sizeof d->tx);
1073
}
1074

    
1075
static void pci_e1000_init(PCIDevice *pci_dev)
1076
{
1077
    E1000State *d = (E1000State *)pci_dev;
1078
    uint8_t *pci_conf;
1079
    uint16_t checksum = 0;
1080
    static const char info_str[] = "e1000";
1081
    int i;
1082
    uint8_t macaddr[6];
1083

    
1084
    pci_conf = d->dev.config;
1085

    
1086
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1087
    pci_config_set_device_id(pci_conf, E1000_DEVID);
1088
    *(uint16_t *)(pci_conf+0x04) = cpu_to_le16(0x0407);
1089
    *(uint16_t *)(pci_conf+0x06) = cpu_to_le16(0x0010);
1090
    pci_conf[0x08] = 0x03;
1091
    pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
1092
    pci_conf[0x0c] = 0x10;
1093

    
1094
    pci_conf[0x3d] = 1; // interrupt pin 0
1095

    
1096
    d->mmio_index = cpu_register_io_memory(e1000_mmio_read,
1097
            e1000_mmio_write, d);
1098

    
1099
    pci_register_bar((PCIDevice *)d, 0, PNPMMIO_SIZE,
1100
                           PCI_ADDRESS_SPACE_MEM, e1000_mmio_map);
1101

    
1102
    pci_register_bar((PCIDevice *)d, 1, IOPORT_SIZE,
1103
                           PCI_ADDRESS_SPACE_IO, ioport_map);
1104

    
1105
    memmove(d->eeprom_data, e1000_eeprom_template,
1106
        sizeof e1000_eeprom_template);
1107
    qdev_get_macaddr(&d->dev.qdev, macaddr);
1108
    for (i = 0; i < 3; i++)
1109
        d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
1110
    for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1111
        checksum += d->eeprom_data[i];
1112
    checksum = (uint16_t) EEPROM_SUM - checksum;
1113
    d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
1114

    
1115
    d->vc = qdev_get_vlan_client(&d->dev.qdev,
1116
                                 e1000_can_receive, e1000_receive,
1117
                                 NULL, e1000_cleanup, d);
1118
    d->vc->link_status_changed = e1000_set_link_status;
1119

    
1120
    qemu_format_nic_info_str(d->vc, macaddr);
1121

    
1122
    register_savevm(info_str, -1, 2, nic_save, nic_load, d);
1123
    d->dev.unregister = pci_e1000_uninit;
1124
    qemu_register_reset(e1000_reset, d);
1125
    e1000_reset(d);
1126
}
1127

    
1128
static void e1000_register_devices(void)
1129
{
1130
    pci_qdev_register("e1000", sizeof(E1000State), pci_e1000_init);
1131
}
1132

    
1133
device_init(e1000_register_devices)