~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to hw/e1000.c

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno, Aurelien Jarno
  • Date: 2009-03-07 06:20:34 UTC
  • mfrom: (1.1.9 upstream)
  • mto: This revision was merged to the branch mainline in revision 7.
  • Revision ID: james.westby@ubuntu.com-20090307062034-i3pead4mw653v2el
Tags: 0.10.0-1
[ Aurelien Jarno ]
* New upstream release:
  - Fix fr-be keyboard mapping (closes: bug#514462).
  - Fix stat64 structure on ppc-linux-user (closes: bug#470231).
  - Add a chroot option (closes: bug#415996).
  - Add evdev support (closes: bug#513210).
  - Fix loop on symlinks in user mode (closes: bug#297572).
  - Bump depends on openbios-sparc.
  - Depends on openbios-ppc.
  - Update 12_signal_powerpc_support.patch.
  - Update 21_net_soopts.patch.
  - Drop 44_socklen_t_check.patch (merged upstream).
  - Drop 49_null_check.patch (merged upstream).
  - Update 64_ppc_asm_constraints.patch.
  - Drop security/CVE-2008-0928-fedora.patch (merged upstream).
  - Drop security/CVE-2007-5730.patch (merged upstream).
* patches/80_stable-branch.patch: add patches from stable branch:
  - Fix race condition between signal handler/execution loop (closes:
    bug#474386, bug#501731).
* debian/copyright: update.
* Compile and install .dtb files:
  - debian/control: build-depends on device-tree-compiler.
  - debian/patches/81_compile_dtb.patch: new patch from upstream.
  - debian/rules: compile and install bamboo.dtb and mpc8544.dtb.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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, params...) do { \
 
45
    if (debugflags & DBGBIT(what)) \
 
46
        fprintf(stderr, "e1000: " fmt, ##params); \
 
47
    } while (0)
 
48
#else
 
49
#define DBGOUT(what, fmt, params...) 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
    NICInfo *nd;
 
79
    int mmio_index;
 
80
 
 
81
    uint32_t mac_reg[0x8000];
 
82
    uint16_t phy_reg[0x20];
 
83
    uint16_t eeprom_data[64];
 
84
 
 
85
    uint32_t rxbuf_size;
 
86
    uint32_t rxbuf_min_shift;
 
87
    int check_rxov;
 
88
    struct e1000_tx {
 
89
        unsigned char header[256];
 
90
        unsigned char vlan_header[4];
 
91
        unsigned char vlan[4];
 
92
        unsigned char data[0x10000];
 
93
        uint16_t size;
 
94
        unsigned char sum_needed;
 
95
        unsigned char vlan_needed;
 
96
        uint8_t ipcss;
 
97
        uint8_t ipcso;
 
98
        uint16_t ipcse;
 
99
        uint8_t tucss;
 
100
        uint8_t tucso;
 
101
        uint16_t tucse;
 
102
        uint8_t hdr_len;
 
103
        uint16_t mss;
 
104
        uint32_t paylen;
 
105
        uint16_t tso_frames;
 
106
        char tse;
 
107
        int8_t ip;
 
108
        int8_t tcp;
 
109
        char cptse;     // current packet tse bit
 
110
    } tx;
 
111
 
 
112
    struct {
 
113
        uint32_t val_in;        // shifted in from guest driver
 
114
        uint16_t bitnum_in;
 
115
        uint16_t bitnum_out;
 
116
        uint16_t reading;
 
117
        uint32_t old_eecd;
 
118
    } eecd_state;
 
119
} E1000State;
 
120
 
 
121
#define defreg(x)       x = (E1000_##x>>2)
 
122
enum {
 
123
    defreg(CTRL),       defreg(EECD),   defreg(EERD),   defreg(GPRC),
 
124
    defreg(GPTC),       defreg(ICR),    defreg(ICS),    defreg(IMC),
 
125
    defreg(IMS),        defreg(LEDCTL), defreg(MANC),   defreg(MDIC),
 
126
    defreg(MPC),        defreg(PBA),    defreg(RCTL),   defreg(RDBAH),
 
127
    defreg(RDBAL),      defreg(RDH),    defreg(RDLEN),  defreg(RDT),
 
128
    defreg(STATUS),     defreg(SWSM),   defreg(TCTL),   defreg(TDBAH),
 
129
    defreg(TDBAL),      defreg(TDH),    defreg(TDLEN),  defreg(TDT),
 
130
    defreg(TORH),       defreg(TORL),   defreg(TOTH),   defreg(TOTL),
 
131
    defreg(TPR),        defreg(TPT),    defreg(TXDCTL), defreg(WUFC),
 
132
    defreg(RA),         defreg(MTA),    defreg(CRCERRS),defreg(VFTA),
 
133
    defreg(VET),
 
134
};
 
135
 
 
136
enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
 
137
static const char phy_regcap[0x20] = {
 
138
    [PHY_STATUS] = PHY_R,       [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
 
139
    [PHY_ID1] = PHY_R,          [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
 
140
    [PHY_CTRL] = PHY_RW,        [PHY_1000T_CTRL] = PHY_RW,
 
141
    [PHY_LP_ABILITY] = PHY_R,   [PHY_1000T_STATUS] = PHY_R,
 
142
    [PHY_AUTONEG_ADV] = PHY_RW, [M88E1000_RX_ERR_CNTR] = PHY_R,
 
143
    [PHY_ID2] = PHY_R,          [M88E1000_PHY_SPEC_STATUS] = PHY_R
 
144
};
 
145
 
 
146
static void
 
147
ioport_map(PCIDevice *pci_dev, int region_num, uint32_t addr,
 
148
           uint32_t size, int type)
 
149
{
 
150
    DBGOUT(IO, "e1000_ioport_map addr=0x%04x size=0x%08x\n", addr, size);
 
151
}
 
152
 
 
153
static void
 
154
set_interrupt_cause(E1000State *s, int index, uint32_t val)
 
155
{
 
156
    if (val)
 
157
        val |= E1000_ICR_INT_ASSERTED;
 
158
    s->mac_reg[ICR] = val;
 
159
    qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
 
160
}
 
161
 
 
162
static void
 
163
set_ics(E1000State *s, int index, uint32_t val)
 
164
{
 
165
    DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
 
166
        s->mac_reg[IMS]);
 
167
    set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
 
168
}
 
169
 
 
170
static int
 
171
rxbufsize(uint32_t v)
 
172
{
 
173
    v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
 
174
         E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
 
175
         E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
 
176
    switch (v) {
 
177
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
 
178
        return 16384;
 
179
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
 
180
        return 8192;
 
181
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
 
182
        return 4096;
 
183
    case E1000_RCTL_SZ_1024:
 
184
        return 1024;
 
185
    case E1000_RCTL_SZ_512:
 
186
        return 512;
 
187
    case E1000_RCTL_SZ_256:
 
188
        return 256;
 
189
    }
 
190
    return 2048;
 
191
}
 
192
 
 
193
static void
 
194
set_rx_control(E1000State *s, int index, uint32_t val)
 
195
{
 
196
    s->mac_reg[RCTL] = val;
 
197
    s->rxbuf_size = rxbufsize(val);
 
198
    s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
 
199
    DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
 
200
           s->mac_reg[RCTL]);
 
201
}
 
202
 
 
203
static void
 
204
set_mdic(E1000State *s, int index, uint32_t val)
 
205
{
 
206
    uint32_t data = val & E1000_MDIC_DATA_MASK;
 
207
    uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
 
208
 
 
209
    if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
 
210
        val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
 
211
    else if (val & E1000_MDIC_OP_READ) {
 
212
        DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
 
213
        if (!(phy_regcap[addr] & PHY_R)) {
 
214
            DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
 
215
            val |= E1000_MDIC_ERROR;
 
216
        } else
 
217
            val = (val ^ data) | s->phy_reg[addr];
 
218
    } else if (val & E1000_MDIC_OP_WRITE) {
 
219
        DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
 
220
        if (!(phy_regcap[addr] & PHY_W)) {
 
221
            DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
 
222
            val |= E1000_MDIC_ERROR;
 
223
        } else
 
224
            s->phy_reg[addr] = data;
 
225
    }
 
226
    s->mac_reg[MDIC] = val | E1000_MDIC_READY;
 
227
    set_ics(s, 0, E1000_ICR_MDAC);
 
228
}
 
229
 
 
230
static uint32_t
 
231
get_eecd(E1000State *s, int index)
 
232
{
 
233
    uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
 
234
 
 
235
    DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
 
236
           s->eecd_state.bitnum_out, s->eecd_state.reading);
 
237
    if (!s->eecd_state.reading ||
 
238
        ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
 
239
          ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
 
240
        ret |= E1000_EECD_DO;
 
241
    return ret;
 
242
}
 
243
 
 
244
static void
 
245
set_eecd(E1000State *s, int index, uint32_t val)
 
246
{
 
247
    uint32_t oldval = s->eecd_state.old_eecd;
 
248
 
 
249
    s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
 
250
            E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
 
251
    if (!(E1000_EECD_SK & (val ^ oldval)))      // no clock edge
 
252
        return;
 
253
    if (!(E1000_EECD_SK & val)) {               // falling edge
 
254
        s->eecd_state.bitnum_out++;
 
255
        return;
 
256
    }
 
257
    if (!(val & E1000_EECD_CS)) {               // rising, no CS (EEPROM reset)
 
258
        memset(&s->eecd_state, 0, sizeof s->eecd_state);
 
259
        return;
 
260
    }
 
261
    s->eecd_state.val_in <<= 1;
 
262
    if (val & E1000_EECD_DI)
 
263
        s->eecd_state.val_in |= 1;
 
264
    if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
 
265
        s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
 
266
        s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
 
267
            EEPROM_READ_OPCODE_MICROWIRE);
 
268
    }
 
269
    DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
 
270
           s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
 
271
           s->eecd_state.reading);
 
272
}
 
273
 
 
274
static uint32_t
 
275
flash_eerd_read(E1000State *s, int x)
 
276
{
 
277
    unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
 
278
 
 
279
    if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
 
280
        return 0;
 
281
    return (s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
 
282
           E1000_EEPROM_RW_REG_DONE | r;
 
283
}
 
284
 
 
285
static void
 
286
putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
 
287
{
 
288
    uint32_t sum;
 
289
 
 
290
    if (cse && cse < n)
 
291
        n = cse + 1;
 
292
    if (sloc < n-1) {
 
293
        sum = net_checksum_add(n-css, data+css);
 
294
        cpu_to_be16wu((uint16_t *)(data + sloc),
 
295
                      net_checksum_finish(sum));
 
296
    }
 
297
}
 
298
 
 
299
static inline int
 
300
vlan_enabled(E1000State *s)
 
301
{
 
302
    return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
 
303
}
 
304
 
 
305
static inline int
 
306
vlan_rx_filter_enabled(E1000State *s)
 
307
{
 
308
    return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
 
309
}
 
310
 
 
311
static inline int
 
312
is_vlan_packet(E1000State *s, const uint8_t *buf)
 
313
{
 
314
    return (be16_to_cpup((uint16_t *)(buf + 12)) ==
 
315
                le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
 
316
}
 
317
 
 
318
static inline int
 
319
is_vlan_txd(uint32_t txd_lower)
 
320
{
 
321
    return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
 
322
}
 
323
 
 
324
static void
 
325
xmit_seg(E1000State *s)
 
326
{
 
327
    uint16_t len, *sp;
 
328
    unsigned int frames = s->tx.tso_frames, css, sofar, n;
 
329
    struct e1000_tx *tp = &s->tx;
 
330
 
 
331
    if (tp->tse && tp->cptse) {
 
332
        css = tp->ipcss;
 
333
        DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
 
334
               frames, tp->size, css);
 
335
        if (tp->ip) {           // IPv4
 
336
            cpu_to_be16wu((uint16_t *)(tp->data+css+2),
 
337
                          tp->size - css);
 
338
            cpu_to_be16wu((uint16_t *)(tp->data+css+4),
 
339
                          be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
 
340
        } else                  // IPv6
 
341
            cpu_to_be16wu((uint16_t *)(tp->data+css+4),
 
342
                          tp->size - css);
 
343
        css = tp->tucss;
 
344
        len = tp->size - css;
 
345
        DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
 
346
        if (tp->tcp) {
 
347
            sofar = frames * tp->mss;
 
348
            cpu_to_be32wu((uint32_t *)(tp->data+css+4), // seq
 
349
                be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
 
350
            if (tp->paylen - sofar > tp->mss)
 
351
                tp->data[css + 13] &= ~9;               // PSH, FIN
 
352
        } else  // UDP
 
353
            cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
 
354
        if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
 
355
            // add pseudo-header length before checksum calculation
 
356
            sp = (uint16_t *)(tp->data + tp->tucso);
 
357
            cpu_to_be16wu(sp, be16_to_cpup(sp) + len);
 
358
        }
 
359
        tp->tso_frames++;
 
360
    }
 
361
 
 
362
    if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
 
363
        putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
 
364
    if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
 
365
        putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
 
366
    if (tp->vlan_needed) {
 
367
        memmove(tp->vlan, tp->data, 12);
 
368
        memcpy(tp->data + 8, tp->vlan_header, 4);
 
369
        qemu_send_packet(s->vc, tp->vlan, tp->size + 4);
 
370
    } else
 
371
        qemu_send_packet(s->vc, tp->data, tp->size);
 
372
    s->mac_reg[TPT]++;
 
373
    s->mac_reg[GPTC]++;
 
374
    n = s->mac_reg[TOTL];
 
375
    if ((s->mac_reg[TOTL] += s->tx.size) < n)
 
376
        s->mac_reg[TOTH]++;
 
377
}
 
378
 
 
379
static void
 
380
process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
 
381
{
 
382
    uint32_t txd_lower = le32_to_cpu(dp->lower.data);
 
383
    uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
 
384
    unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
 
385
    unsigned int msh = 0xfffff, hdr = 0;
 
386
    uint64_t addr;
 
387
    struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
 
388
    struct e1000_tx *tp = &s->tx;
 
389
 
 
390
    if (dtype == E1000_TXD_CMD_DEXT) {  // context descriptor
 
391
        op = le32_to_cpu(xp->cmd_and_length);
 
392
        tp->ipcss = xp->lower_setup.ip_fields.ipcss;
 
393
        tp->ipcso = xp->lower_setup.ip_fields.ipcso;
 
394
        tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
 
395
        tp->tucss = xp->upper_setup.tcp_fields.tucss;
 
396
        tp->tucso = xp->upper_setup.tcp_fields.tucso;
 
397
        tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
 
398
        tp->paylen = op & 0xfffff;
 
399
        tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
 
400
        tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
 
401
        tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
 
402
        tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
 
403
        tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
 
404
        tp->tso_frames = 0;
 
405
        if (tp->tucso == 0) {   // this is probably wrong
 
406
            DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
 
407
            tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
 
408
        }
 
409
        return;
 
410
    } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
 
411
        // data descriptor
 
412
        tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
 
413
        tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
 
414
    } else
 
415
        // legacy descriptor
 
416
        tp->cptse = 0;
 
417
 
 
418
    if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
 
419
        (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
 
420
        tp->vlan_needed = 1;
 
421
        cpu_to_be16wu((uint16_t *)(tp->vlan_header),
 
422
                      le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
 
423
        cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
 
424
                      le16_to_cpu(dp->upper.fields.special));
 
425
    }
 
426
        
 
427
    addr = le64_to_cpu(dp->buffer_addr);
 
428
    if (tp->tse && tp->cptse) {
 
429
        hdr = tp->hdr_len;
 
430
        msh = hdr + tp->mss;
 
431
        do {
 
432
            bytes = split_size;
 
433
            if (tp->size + bytes > msh)
 
434
                bytes = msh - tp->size;
 
435
            cpu_physical_memory_read(addr, tp->data + tp->size, bytes);
 
436
            if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
 
437
                memmove(tp->header, tp->data, hdr);
 
438
            tp->size = sz;
 
439
            addr += bytes;
 
440
            if (sz == msh) {
 
441
                xmit_seg(s);
 
442
                memmove(tp->data, tp->header, hdr);
 
443
                tp->size = hdr;
 
444
            }
 
445
        } while (split_size -= bytes);
 
446
    } else if (!tp->tse && tp->cptse) {
 
447
        // context descriptor TSE is not set, while data descriptor TSE is set
 
448
        DBGOUT(TXERR, "TCP segmentaion Error\n");
 
449
    } else {
 
450
        cpu_physical_memory_read(addr, tp->data + tp->size, split_size);
 
451
        tp->size += split_size;
 
452
    }
 
453
 
 
454
    if (!(txd_lower & E1000_TXD_CMD_EOP))
 
455
        return;
 
456
    if (!(tp->tse && tp->cptse && tp->size < hdr))
 
457
        xmit_seg(s);
 
458
    tp->tso_frames = 0;
 
459
    tp->sum_needed = 0;
 
460
    tp->vlan_needed = 0;
 
461
    tp->size = 0;
 
462
    tp->cptse = 0;
 
463
}
 
464
 
 
465
static uint32_t
 
466
txdesc_writeback(target_phys_addr_t base, struct e1000_tx_desc *dp)
 
467
{
 
468
    uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
 
469
 
 
470
    if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
 
471
        return 0;
 
472
    txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
 
473
                ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
 
474
    dp->upper.data = cpu_to_le32(txd_upper);
 
475
    cpu_physical_memory_write(base + ((char *)&dp->upper - (char *)dp),
 
476
                              (void *)&dp->upper, sizeof(dp->upper));
 
477
    return E1000_ICR_TXDW;
 
478
}
 
479
 
 
480
static void
 
481
start_xmit(E1000State *s)
 
482
{
 
483
    target_phys_addr_t base;
 
484
    struct e1000_tx_desc desc;
 
485
    uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
 
486
 
 
487
    if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
 
488
        DBGOUT(TX, "tx disabled\n");
 
489
        return;
 
490
    }
 
491
 
 
492
    while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
 
493
        base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
 
494
               sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
 
495
        cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
 
496
 
 
497
        DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
 
498
               (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
 
499
               desc.upper.data);
 
500
 
 
501
        process_tx_desc(s, &desc);
 
502
        cause |= txdesc_writeback(base, &desc);
 
503
 
 
504
        if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
 
505
            s->mac_reg[TDH] = 0;
 
506
        /*
 
507
         * the following could happen only if guest sw assigns
 
508
         * bogus values to TDT/TDLEN.
 
509
         * there's nothing too intelligent we could do about this.
 
510
         */
 
511
        if (s->mac_reg[TDH] == tdh_start) {
 
512
            DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
 
513
                   tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
 
514
            break;
 
515
        }
 
516
    }
 
517
    set_ics(s, 0, cause);
 
518
}
 
519
 
 
520
static int
 
521
receive_filter(E1000State *s, const uint8_t *buf, int size)
 
522
{
 
523
    static uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 
524
    static int mta_shift[] = {4, 3, 2, 0};
 
525
    uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
 
526
 
 
527
    if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
 
528
        uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
 
529
        uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
 
530
                                     ((vid >> 5) & 0x7f));
 
531
        if ((vfta & (1 << (vid & 0x1f))) == 0)
 
532
            return 0;
 
533
    }
 
534
 
 
535
    if (rctl & E1000_RCTL_UPE)                  // promiscuous
 
536
        return 1;
 
537
 
 
538
    if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE))        // promiscuous mcast
 
539
        return 1;
 
540
 
 
541
    if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
 
542
        return 1;
 
543
 
 
544
    for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
 
545
        if (!(rp[1] & E1000_RAH_AV))
 
546
            continue;
 
547
        ra[0] = cpu_to_le32(rp[0]);
 
548
        ra[1] = cpu_to_le32(rp[1]);
 
549
        if (!memcmp(buf, (uint8_t *)ra, 6)) {
 
550
            DBGOUT(RXFILTER,
 
551
                   "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
 
552
                   (int)(rp - s->mac_reg - RA)/2,
 
553
                   buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
 
554
            return 1;
 
555
        }
 
556
    }
 
557
    DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
 
558
           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
 
559
 
 
560
    f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
 
561
    f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
 
562
    if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
 
563
        return 1;
 
564
    DBGOUT(RXFILTER,
 
565
           "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
 
566
           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
 
567
           (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
 
568
           s->mac_reg[MTA + (f >> 5)]);
 
569
 
 
570
    return 0;
 
571
}
 
572
 
 
573
static void
 
574
e1000_set_link_status(VLANClientState *vc)
 
575
{
 
576
    E1000State *s = vc->opaque;
 
577
    uint32_t old_status = s->mac_reg[STATUS];
 
578
 
 
579
    if (vc->link_down)
 
580
        s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
 
581
    else
 
582
        s->mac_reg[STATUS] |= E1000_STATUS_LU;
 
583
 
 
584
    if (s->mac_reg[STATUS] != old_status)
 
585
        set_ics(s, 0, E1000_ICR_LSC);
 
586
}
 
587
 
 
588
static int
 
589
e1000_can_receive(void *opaque)
 
590
{
 
591
    E1000State *s = opaque;
 
592
 
 
593
    return (s->mac_reg[RCTL] & E1000_RCTL_EN);
 
594
}
 
595
 
 
596
static void
 
597
e1000_receive(void *opaque, const uint8_t *buf, int size)
 
598
{
 
599
    E1000State *s = opaque;
 
600
    struct e1000_rx_desc desc;
 
601
    target_phys_addr_t base;
 
602
    unsigned int n, rdt;
 
603
    uint32_t rdh_start;
 
604
    uint16_t vlan_special = 0;
 
605
    uint8_t vlan_status = 0, vlan_offset = 0;
 
606
 
 
607
    if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
 
608
        return;
 
609
 
 
610
    if (size > s->rxbuf_size) {
 
611
        DBGOUT(RX, "packet too large for buffers (%d > %d)\n", size,
 
612
               s->rxbuf_size);
 
613
        return;
 
614
    }
 
615
 
 
616
    if (!receive_filter(s, buf, size))
 
617
        return;
 
618
 
 
619
    if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
 
620
        vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
 
621
        memmove((void *)(buf + 4), buf, 12);
 
622
        vlan_status = E1000_RXD_STAT_VP;
 
623
        vlan_offset = 4;
 
624
        size -= 4;
 
625
    }
 
626
 
 
627
    rdh_start = s->mac_reg[RDH];
 
628
    size += 4; // for the header
 
629
    do {
 
630
        if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) {
 
631
            set_ics(s, 0, E1000_ICS_RXO);
 
632
            return;
 
633
        }
 
634
        base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
 
635
               sizeof(desc) * s->mac_reg[RDH];
 
636
        cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
 
637
        desc.special = vlan_special;
 
638
        desc.status |= (vlan_status | E1000_RXD_STAT_DD);
 
639
        if (desc.buffer_addr) {
 
640
            cpu_physical_memory_write(le64_to_cpu(desc.buffer_addr),
 
641
                                      (void *)(buf + vlan_offset), size);
 
642
            desc.length = cpu_to_le16(size);
 
643
            desc.status |= E1000_RXD_STAT_EOP|E1000_RXD_STAT_IXSM;
 
644
        } else // as per intel docs; skip descriptors with null buf addr
 
645
            DBGOUT(RX, "Null RX descriptor!!\n");
 
646
        cpu_physical_memory_write(base, (void *)&desc, sizeof(desc));
 
647
 
 
648
        if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
 
649
            s->mac_reg[RDH] = 0;
 
650
        s->check_rxov = 1;
 
651
        /* see comment in start_xmit; same here */
 
652
        if (s->mac_reg[RDH] == rdh_start) {
 
653
            DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
 
654
                   rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
 
655
            set_ics(s, 0, E1000_ICS_RXO);
 
656
            return;
 
657
        }
 
658
    } while (desc.buffer_addr == 0);
 
659
 
 
660
    s->mac_reg[GPRC]++;
 
661
    s->mac_reg[TPR]++;
 
662
    n = s->mac_reg[TORL];
 
663
    if ((s->mac_reg[TORL] += size) < n)
 
664
        s->mac_reg[TORH]++;
 
665
 
 
666
    n = E1000_ICS_RXT0;
 
667
    if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
 
668
        rdt += s->mac_reg[RDLEN] / sizeof(desc);
 
669
    if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) << s->rxbuf_min_shift >=
 
670
        s->mac_reg[RDLEN])
 
671
        n |= E1000_ICS_RXDMT0;
 
672
 
 
673
    set_ics(s, 0, n);
 
674
}
 
675
 
 
676
static uint32_t
 
677
mac_readreg(E1000State *s, int index)
 
678
{
 
679
    return s->mac_reg[index];
 
680
}
 
681
 
 
682
static uint32_t
 
683
mac_icr_read(E1000State *s, int index)
 
684
{
 
685
    uint32_t ret = s->mac_reg[ICR];
 
686
 
 
687
    DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
 
688
    set_interrupt_cause(s, 0, 0);
 
689
    return ret;
 
690
}
 
691
 
 
692
static uint32_t
 
693
mac_read_clr4(E1000State *s, int index)
 
694
{
 
695
    uint32_t ret = s->mac_reg[index];
 
696
 
 
697
    s->mac_reg[index] = 0;
 
698
    return ret;
 
699
}
 
700
 
 
701
static uint32_t
 
702
mac_read_clr8(E1000State *s, int index)
 
703
{
 
704
    uint32_t ret = s->mac_reg[index];
 
705
 
 
706
    s->mac_reg[index] = 0;
 
707
    s->mac_reg[index-1] = 0;
 
708
    return ret;
 
709
}
 
710
 
 
711
static void
 
712
mac_writereg(E1000State *s, int index, uint32_t val)
 
713
{
 
714
    s->mac_reg[index] = val;
 
715
}
 
716
 
 
717
static void
 
718
set_rdt(E1000State *s, int index, uint32_t val)
 
719
{
 
720
    s->check_rxov = 0;
 
721
    s->mac_reg[index] = val & 0xffff;
 
722
}
 
723
 
 
724
static void
 
725
set_16bit(E1000State *s, int index, uint32_t val)
 
726
{
 
727
    s->mac_reg[index] = val & 0xffff;
 
728
}
 
729
 
 
730
static void
 
731
set_dlen(E1000State *s, int index, uint32_t val)
 
732
{
 
733
    s->mac_reg[index] = val & 0xfff80;
 
734
}
 
735
 
 
736
static void
 
737
set_tctl(E1000State *s, int index, uint32_t val)
 
738
{
 
739
    s->mac_reg[index] = val;
 
740
    s->mac_reg[TDT] &= 0xffff;
 
741
    start_xmit(s);
 
742
}
 
743
 
 
744
static void
 
745
set_icr(E1000State *s, int index, uint32_t val)
 
746
{
 
747
    DBGOUT(INTERRUPT, "set_icr %x\n", val);
 
748
    set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
 
749
}
 
750
 
 
751
static void
 
752
set_imc(E1000State *s, int index, uint32_t val)
 
753
{
 
754
    s->mac_reg[IMS] &= ~val;
 
755
    set_ics(s, 0, 0);
 
756
}
 
757
 
 
758
static void
 
759
set_ims(E1000State *s, int index, uint32_t val)
 
760
{
 
761
    s->mac_reg[IMS] |= val;
 
762
    set_ics(s, 0, 0);
 
763
}
 
764
 
 
765
#define getreg(x)       [x] = mac_readreg
 
766
static uint32_t (*macreg_readops[])(E1000State *, int) = {
 
767
    getreg(PBA),        getreg(RCTL),   getreg(TDH),    getreg(TXDCTL),
 
768
    getreg(WUFC),       getreg(TDT),    getreg(CTRL),   getreg(LEDCTL),
 
769
    getreg(MANC),       getreg(MDIC),   getreg(SWSM),   getreg(STATUS),
 
770
    getreg(TORL),       getreg(TOTL),   getreg(IMS),    getreg(TCTL),
 
771
    getreg(RDH),        getreg(RDT),    getreg(VET),
 
772
 
 
773
    [TOTH] = mac_read_clr8,     [TORH] = mac_read_clr8, [GPRC] = mac_read_clr4,
 
774
    [GPTC] = mac_read_clr4,     [TPR] = mac_read_clr4,  [TPT] = mac_read_clr4,
 
775
    [ICR] = mac_icr_read,       [EECD] = get_eecd,      [EERD] = flash_eerd_read,
 
776
    [CRCERRS ... MPC] = &mac_readreg,
 
777
    [RA ... RA+31] = &mac_readreg,
 
778
    [MTA ... MTA+127] = &mac_readreg,
 
779
    [VFTA ... VFTA+127] = &mac_readreg,
 
780
};
 
781
enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
 
782
 
 
783
#define putreg(x)       [x] = mac_writereg
 
784
static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
 
785
    putreg(PBA),        putreg(EERD),   putreg(SWSM),   putreg(WUFC),
 
786
    putreg(TDBAL),      putreg(TDBAH),  putreg(TXDCTL), putreg(RDBAH),
 
787
    putreg(RDBAL),      putreg(LEDCTL), putreg(CTRL),   putreg(VET),
 
788
    [TDLEN] = set_dlen, [RDLEN] = set_dlen,     [TCTL] = set_tctl,
 
789
    [TDT] = set_tctl,   [MDIC] = set_mdic,      [ICS] = set_ics,
 
790
    [TDH] = set_16bit,  [RDH] = set_16bit,      [RDT] = set_rdt,
 
791
    [IMC] = set_imc,    [IMS] = set_ims,        [ICR] = set_icr,
 
792
    [EECD] = set_eecd,  [RCTL] = set_rx_control,
 
793
    [RA ... RA+31] = &mac_writereg,
 
794
    [MTA ... MTA+127] = &mac_writereg,
 
795
    [VFTA ... VFTA+127] = &mac_writereg,
 
796
};
 
797
enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
 
798
 
 
799
static void
 
800
e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
 
801
{
 
802
    E1000State *s = opaque;
 
803
    unsigned int index = (addr & 0x1ffff) >> 2;
 
804
 
 
805
#ifdef TARGET_WORDS_BIGENDIAN
 
806
    val = bswap32(val);
 
807
#endif
 
808
    if (index < NWRITEOPS && macreg_writeops[index])
 
809
        macreg_writeops[index](s, index, val);
 
810
    else if (index < NREADOPS && macreg_readops[index])
 
811
        DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04x\n", index<<2, val);
 
812
    else
 
813
        DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
 
814
               index<<2, val);
 
815
}
 
816
 
 
817
static void
 
818
e1000_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
 
819
{
 
820
    // emulate hw without byte enables: no RMW
 
821
    e1000_mmio_writel(opaque, addr & ~3,
 
822
                      (val & 0xffff) << (8*(addr & 3)));
 
823
}
 
824
 
 
825
static void
 
826
e1000_mmio_writeb(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 & 0xff) << (8*(addr & 3)));
 
831
}
 
832
 
 
833
static uint32_t
 
834
e1000_mmio_readl(void *opaque, target_phys_addr_t addr)
 
835
{
 
836
    E1000State *s = opaque;
 
837
    unsigned int index = (addr & 0x1ffff) >> 2;
 
838
 
 
839
    if (index < NREADOPS && macreg_readops[index])
 
840
    {
 
841
        uint32_t val = macreg_readops[index](s, index);
 
842
#ifdef TARGET_WORDS_BIGENDIAN
 
843
        val = bswap32(val);
 
844
#endif
 
845
        return val;
 
846
    }
 
847
    DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
 
848
    return 0;
 
849
}
 
850
 
 
851
static uint32_t
 
852
e1000_mmio_readb(void *opaque, target_phys_addr_t addr)
 
853
{
 
854
    return ((e1000_mmio_readl(opaque, addr & ~3)) >>
 
855
            (8 * (addr & 3))) & 0xff;
 
856
}
 
857
 
 
858
static uint32_t
 
859
e1000_mmio_readw(void *opaque, target_phys_addr_t addr)
 
860
{
 
861
    return ((e1000_mmio_readl(opaque, addr & ~3)) >>
 
862
            (8 * (addr & 3))) & 0xffff;
 
863
}
 
864
 
 
865
static const int mac_regtosave[] = {
 
866
    CTRL,       EECD,   EERD,   GPRC,   GPTC,   ICR,    ICS,    IMC,    IMS,
 
867
    LEDCTL,     MANC,   MDIC,   MPC,    PBA,    RCTL,   RDBAH,  RDBAL,  RDH,
 
868
    RDLEN,      RDT,    STATUS, SWSM,   TCTL,   TDBAH,  TDBAL,  TDH,    TDLEN,
 
869
    TDT,        TORH,   TORL,   TOTH,   TOTL,   TPR,    TPT,    TXDCTL, WUFC,
 
870
    VET,
 
871
};
 
872
enum { MAC_NSAVE = ARRAY_SIZE(mac_regtosave) };
 
873
 
 
874
static const struct {
 
875
    int size;
 
876
    int array0;
 
877
} mac_regarraystosave[] = { {32, RA}, {128, MTA}, {128, VFTA} };
 
878
enum { MAC_NARRAYS = ARRAY_SIZE(mac_regarraystosave) };
 
879
 
 
880
static void
 
881
nic_save(QEMUFile *f, void *opaque)
 
882
{
 
883
    E1000State *s = (E1000State *)opaque;
 
884
    int i, j;
 
885
 
 
886
    pci_device_save(&s->dev, f);
 
887
    qemu_put_be32(f, 0);
 
888
    qemu_put_be32s(f, &s->rxbuf_size);
 
889
    qemu_put_be32s(f, &s->rxbuf_min_shift);
 
890
    qemu_put_be32s(f, &s->eecd_state.val_in);
 
891
    qemu_put_be16s(f, &s->eecd_state.bitnum_in);
 
892
    qemu_put_be16s(f, &s->eecd_state.bitnum_out);
 
893
    qemu_put_be16s(f, &s->eecd_state.reading);
 
894
    qemu_put_be32s(f, &s->eecd_state.old_eecd);
 
895
    qemu_put_8s(f, &s->tx.ipcss);
 
896
    qemu_put_8s(f, &s->tx.ipcso);
 
897
    qemu_put_be16s(f, &s->tx.ipcse);
 
898
    qemu_put_8s(f, &s->tx.tucss);
 
899
    qemu_put_8s(f, &s->tx.tucso);
 
900
    qemu_put_be16s(f, &s->tx.tucse);
 
901
    qemu_put_be32s(f, &s->tx.paylen);
 
902
    qemu_put_8s(f, &s->tx.hdr_len);
 
903
    qemu_put_be16s(f, &s->tx.mss);
 
904
    qemu_put_be16s(f, &s->tx.size);
 
905
    qemu_put_be16s(f, &s->tx.tso_frames);
 
906
    qemu_put_8s(f, &s->tx.sum_needed);
 
907
    qemu_put_s8s(f, &s->tx.ip);
 
908
    qemu_put_s8s(f, &s->tx.tcp);
 
909
    qemu_put_buffer(f, s->tx.header, sizeof s->tx.header);
 
910
    qemu_put_buffer(f, s->tx.data, sizeof s->tx.data);
 
911
    for (i = 0; i < 64; i++)
 
912
        qemu_put_be16s(f, s->eeprom_data + i);
 
913
    for (i = 0; i < 0x20; i++)
 
914
        qemu_put_be16s(f, s->phy_reg + i);
 
915
    for (i = 0; i < MAC_NSAVE; i++)
 
916
        qemu_put_be32s(f, s->mac_reg + mac_regtosave[i]);
 
917
    for (i = 0; i < MAC_NARRAYS; i++)
 
918
        for (j = 0; j < mac_regarraystosave[i].size; j++)
 
919
            qemu_put_be32s(f,
 
920
                           s->mac_reg + mac_regarraystosave[i].array0 + j);
 
921
}
 
922
 
 
923
static int
 
924
nic_load(QEMUFile *f, void *opaque, int version_id)
 
925
{
 
926
    E1000State *s = (E1000State *)opaque;
 
927
    int i, j, ret;
 
928
 
 
929
    if ((ret = pci_device_load(&s->dev, f)) < 0)
 
930
        return ret;
 
931
    if (version_id == 1)
 
932
        qemu_get_sbe32s(f, &i); /* once some unused instance id */
 
933
    qemu_get_be32(f); /* Ignored.  Was mmio_base.  */
 
934
    qemu_get_be32s(f, &s->rxbuf_size);
 
935
    qemu_get_be32s(f, &s->rxbuf_min_shift);
 
936
    qemu_get_be32s(f, &s->eecd_state.val_in);
 
937
    qemu_get_be16s(f, &s->eecd_state.bitnum_in);
 
938
    qemu_get_be16s(f, &s->eecd_state.bitnum_out);
 
939
    qemu_get_be16s(f, &s->eecd_state.reading);
 
940
    qemu_get_be32s(f, &s->eecd_state.old_eecd);
 
941
    qemu_get_8s(f, &s->tx.ipcss);
 
942
    qemu_get_8s(f, &s->tx.ipcso);
 
943
    qemu_get_be16s(f, &s->tx.ipcse);
 
944
    qemu_get_8s(f, &s->tx.tucss);
 
945
    qemu_get_8s(f, &s->tx.tucso);
 
946
    qemu_get_be16s(f, &s->tx.tucse);
 
947
    qemu_get_be32s(f, &s->tx.paylen);
 
948
    qemu_get_8s(f, &s->tx.hdr_len);
 
949
    qemu_get_be16s(f, &s->tx.mss);
 
950
    qemu_get_be16s(f, &s->tx.size);
 
951
    qemu_get_be16s(f, &s->tx.tso_frames);
 
952
    qemu_get_8s(f, &s->tx.sum_needed);
 
953
    qemu_get_s8s(f, &s->tx.ip);
 
954
    qemu_get_s8s(f, &s->tx.tcp);
 
955
    qemu_get_buffer(f, s->tx.header, sizeof s->tx.header);
 
956
    qemu_get_buffer(f, s->tx.data, sizeof s->tx.data);
 
957
    for (i = 0; i < 64; i++)
 
958
        qemu_get_be16s(f, s->eeprom_data + i);
 
959
    for (i = 0; i < 0x20; i++)
 
960
        qemu_get_be16s(f, s->phy_reg + i);
 
961
    for (i = 0; i < MAC_NSAVE; i++)
 
962
        qemu_get_be32s(f, s->mac_reg + mac_regtosave[i]);
 
963
    for (i = 0; i < MAC_NARRAYS; i++)
 
964
        for (j = 0; j < mac_regarraystosave[i].size; j++)
 
965
            qemu_get_be32s(f,
 
966
                           s->mac_reg + mac_regarraystosave[i].array0 + j);
 
967
    return 0;
 
968
}
 
969
 
 
970
static const uint16_t e1000_eeprom_template[64] = {
 
971
    0x0000, 0x0000, 0x0000, 0x0000,      0xffff, 0x0000,      0x0000, 0x0000,
 
972
    0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
 
973
    0x0008, 0x2000, 0x7e14, 0x0048,      0x1000, 0x00d8,      0x0000, 0x2700,
 
974
    0x6cc9, 0x3150, 0x0722, 0x040b,      0x0984, 0x0000,      0xc000, 0x0706,
 
975
    0x1008, 0x0000, 0x0f04, 0x7fff,      0x4d01, 0xffff,      0xffff, 0xffff,
 
976
    0xffff, 0xffff, 0xffff, 0xffff,      0xffff, 0xffff,      0xffff, 0xffff,
 
977
    0x0100, 0x4000, 0x121c, 0xffff,      0xffff, 0xffff,      0xffff, 0xffff,
 
978
    0xffff, 0xffff, 0xffff, 0xffff,      0xffff, 0xffff,      0xffff, 0x0000,
 
979
};
 
980
 
 
981
static const uint16_t phy_reg_init[] = {
 
982
    [PHY_CTRL] = 0x1140,                        [PHY_STATUS] = 0x796d, // link initially up
 
983
    [PHY_ID1] = 0x141,                          [PHY_ID2] = PHY_ID2_INIT,
 
984
    [PHY_1000T_CTRL] = 0x0e00,                  [M88E1000_PHY_SPEC_CTRL] = 0x360,
 
985
    [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60,      [PHY_AUTONEG_ADV] = 0xde1,
 
986
    [PHY_LP_ABILITY] = 0x1e0,                   [PHY_1000T_STATUS] = 0x3c00,
 
987
    [M88E1000_PHY_SPEC_STATUS] = 0xac00,
 
988
};
 
989
 
 
990
static const uint32_t mac_reg_init[] = {
 
991
    [PBA] =     0x00100030,
 
992
    [LEDCTL] =  0x602,
 
993
    [CTRL] =    E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
 
994
                E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
 
995
    [STATUS] =  0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
 
996
                E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
 
997
                E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
 
998
                E1000_STATUS_LU,
 
999
    [MANC] =    E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
 
1000
                E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
 
1001
                E1000_MANC_RMCP_EN,
 
1002
};
 
1003
 
 
1004
/* PCI interface */
 
1005
 
 
1006
static CPUWriteMemoryFunc *e1000_mmio_write[] = {
 
1007
    e1000_mmio_writeb,  e1000_mmio_writew,      e1000_mmio_writel
 
1008
};
 
1009
 
 
1010
static CPUReadMemoryFunc *e1000_mmio_read[] = {
 
1011
    e1000_mmio_readb,   e1000_mmio_readw,       e1000_mmio_readl
 
1012
};
 
1013
 
 
1014
static void
 
1015
e1000_mmio_map(PCIDevice *pci_dev, int region_num,
 
1016
                uint32_t addr, uint32_t size, int type)
 
1017
{
 
1018
    E1000State *d = (E1000State *)pci_dev;
 
1019
    int i;
 
1020
    const uint32_t excluded_regs[] = {
 
1021
        E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
 
1022
        E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
 
1023
    };
 
1024
 
 
1025
 
 
1026
    DBGOUT(MMIO, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr, size);
 
1027
 
 
1028
    cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index);
 
1029
    qemu_register_coalesced_mmio(addr, excluded_regs[0]);
 
1030
 
 
1031
    for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
 
1032
        qemu_register_coalesced_mmio(addr + excluded_regs[i] + 4,
 
1033
                                     excluded_regs[i + 1] -
 
1034
                                     excluded_regs[i] - 4);
 
1035
}
 
1036
 
 
1037
static int
 
1038
pci_e1000_uninit(PCIDevice *dev)
 
1039
{
 
1040
    E1000State *d = (E1000State *) dev;
 
1041
 
 
1042
    cpu_unregister_io_memory(d->mmio_index);
 
1043
 
 
1044
    return 0;
 
1045
}
 
1046
 
 
1047
PCIDevice *
 
1048
pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn)
 
1049
{
 
1050
    E1000State *d;
 
1051
    uint8_t *pci_conf;
 
1052
    uint16_t checksum = 0;
 
1053
    static const char info_str[] = "e1000";
 
1054
    int i;
 
1055
 
 
1056
    d = (E1000State *)pci_register_device(bus, "e1000",
 
1057
                sizeof(E1000State), devfn, NULL, NULL);
 
1058
 
 
1059
    pci_conf = d->dev.config;
 
1060
    memset(pci_conf, 0, 256);
 
1061
 
 
1062
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
 
1063
    pci_config_set_device_id(pci_conf, E1000_DEVID);
 
1064
    *(uint16_t *)(pci_conf+0x04) = cpu_to_le16(0x0407);
 
1065
    *(uint16_t *)(pci_conf+0x06) = cpu_to_le16(0x0010);
 
1066
    pci_conf[0x08] = 0x03;
 
1067
    pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
 
1068
    pci_conf[0x0c] = 0x10;
 
1069
 
 
1070
    pci_conf[0x3d] = 1; // interrupt pin 0
 
1071
 
 
1072
    d->mmio_index = cpu_register_io_memory(0, e1000_mmio_read,
 
1073
            e1000_mmio_write, d);
 
1074
 
 
1075
    pci_register_io_region((PCIDevice *)d, 0, PNPMMIO_SIZE,
 
1076
                           PCI_ADDRESS_SPACE_MEM, e1000_mmio_map);
 
1077
 
 
1078
    pci_register_io_region((PCIDevice *)d, 1, IOPORT_SIZE,
 
1079
                           PCI_ADDRESS_SPACE_IO, ioport_map);
 
1080
 
 
1081
    d->nd = nd;
 
1082
    memmove(d->eeprom_data, e1000_eeprom_template,
 
1083
        sizeof e1000_eeprom_template);
 
1084
    for (i = 0; i < 3; i++)
 
1085
        d->eeprom_data[i] = (nd->macaddr[2*i+1]<<8) | nd->macaddr[2*i];
 
1086
    for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
 
1087
        checksum += d->eeprom_data[i];
 
1088
    checksum = (uint16_t) EEPROM_SUM - checksum;
 
1089
    d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
 
1090
 
 
1091
    memset(d->phy_reg, 0, sizeof d->phy_reg);
 
1092
    memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
 
1093
    memset(d->mac_reg, 0, sizeof d->mac_reg);
 
1094
    memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
 
1095
    d->rxbuf_min_shift = 1;
 
1096
    memset(&d->tx, 0, sizeof d->tx);
 
1097
 
 
1098
    d->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
 
1099
                                 e1000_receive, e1000_can_receive, d);
 
1100
    d->vc->link_status_changed = e1000_set_link_status;
 
1101
 
 
1102
    qemu_format_nic_info_str(d->vc, d->nd->macaddr);
 
1103
 
 
1104
    register_savevm(info_str, -1, 2, nic_save, nic_load, d);
 
1105
    d->dev.unregister = pci_e1000_uninit;
 
1106
 
 
1107
    return (PCIDevice *)d;
 
1108
}