Statistics
| Branch: | Revision:

root / hw / e1000.c @ e7b43f7e

History | View | Annotate | Download (38.1 kB)

1 7c23b892 balrog
/*
2 7c23b892 balrog
 * QEMU e1000 emulation
3 7c23b892 balrog
 *
4 2758aa52 Michael S. Tsirkin
 * Software developer's manual:
5 2758aa52 Michael S. Tsirkin
 * http://download.intel.com/design/network/manuals/8254x_GBe_SDM.pdf
6 2758aa52 Michael S. Tsirkin
 *
7 7c23b892 balrog
 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
8 7c23b892 balrog
 * Copyright (c) 2008 Qumranet
9 7c23b892 balrog
 * Based on work done by:
10 7c23b892 balrog
 * Copyright (c) 2007 Dan Aloni
11 7c23b892 balrog
 * Copyright (c) 2004 Antony T Curtis
12 7c23b892 balrog
 *
13 7c23b892 balrog
 * This library is free software; you can redistribute it and/or
14 7c23b892 balrog
 * modify it under the terms of the GNU Lesser General Public
15 7c23b892 balrog
 * License as published by the Free Software Foundation; either
16 7c23b892 balrog
 * version 2 of the License, or (at your option) any later version.
17 7c23b892 balrog
 *
18 7c23b892 balrog
 * This library is distributed in the hope that it will be useful,
19 7c23b892 balrog
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 7c23b892 balrog
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21 7c23b892 balrog
 * Lesser General Public License for more details.
22 7c23b892 balrog
 *
23 7c23b892 balrog
 * You should have received a copy of the GNU Lesser General Public
24 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
25 7c23b892 balrog
 */
26 7c23b892 balrog
27 7c23b892 balrog
28 7c23b892 balrog
#include "hw.h"
29 7c23b892 balrog
#include "pci.h"
30 7c23b892 balrog
#include "net.h"
31 7200ac3c Mark McLoughlin
#include "net/checksum.h"
32 fbdaa002 Gerd Hoffmann
#include "loader.h"
33 7c23b892 balrog
34 7c23b892 balrog
#include "e1000_hw.h"
35 7c23b892 balrog
36 27124888 Jes Sorensen
#define E1000_DEBUG
37 7c23b892 balrog
38 27124888 Jes Sorensen
#ifdef E1000_DEBUG
39 7c23b892 balrog
enum {
40 7c23b892 balrog
    DEBUG_GENERAL,        DEBUG_IO,        DEBUG_MMIO,        DEBUG_INTERRUPT,
41 7c23b892 balrog
    DEBUG_RX,                DEBUG_TX,        DEBUG_MDIC,        DEBUG_EEPROM,
42 7c23b892 balrog
    DEBUG_UNKNOWN,        DEBUG_TXSUM,        DEBUG_TXERR,        DEBUG_RXERR,
43 7c23b892 balrog
    DEBUG_RXFILTER,        DEBUG_NOTYET,
44 7c23b892 balrog
};
45 7c23b892 balrog
#define DBGBIT(x)        (1<<DEBUG_##x)
46 7c23b892 balrog
static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
47 7c23b892 balrog
48 6c7f4b47 Blue Swirl
#define        DBGOUT(what, fmt, ...) do { \
49 7c23b892 balrog
    if (debugflags & DBGBIT(what)) \
50 6c7f4b47 Blue Swirl
        fprintf(stderr, "e1000: " fmt, ## __VA_ARGS__); \
51 7c23b892 balrog
    } while (0)
52 7c23b892 balrog
#else
53 6c7f4b47 Blue Swirl
#define        DBGOUT(what, fmt, ...) do {} while (0)
54 7c23b892 balrog
#endif
55 7c23b892 balrog
56 7c23b892 balrog
#define IOPORT_SIZE       0x40
57 e94bbefe aurel32
#define PNPMMIO_SIZE      0x20000
58 78aeb23e Stefan Hajnoczi
#define MIN_BUF_SIZE      60 /* Min. octets in an ethernet frame sans FCS */
59 7c23b892 balrog
60 7c23b892 balrog
/*
61 7c23b892 balrog
 * HW models:
62 7c23b892 balrog
 *  E1000_DEV_ID_82540EM works with Windows and Linux
63 7c23b892 balrog
 *  E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
64 7c23b892 balrog
 *        appears to perform better than 82540EM, but breaks with Linux 2.6.18
65 7c23b892 balrog
 *  E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
66 7c23b892 balrog
 *  Others never tested
67 7c23b892 balrog
 */
68 7c23b892 balrog
enum { E1000_DEVID = E1000_DEV_ID_82540EM };
69 7c23b892 balrog
70 7c23b892 balrog
/*
71 7c23b892 balrog
 * May need to specify additional MAC-to-PHY entries --
72 7c23b892 balrog
 * Intel's Windows driver refuses to initialize unless they match
73 7c23b892 balrog
 */
74 7c23b892 balrog
enum {
75 7c23b892 balrog
    PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ?                0xcc2 :
76 7c23b892 balrog
                   E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ?        0xc30 :
77 7c23b892 balrog
                   /* default to E1000_DEV_ID_82540EM */        0xc20
78 7c23b892 balrog
};
79 7c23b892 balrog
80 7c23b892 balrog
typedef struct E1000State_st {
81 7c23b892 balrog
    PCIDevice dev;
82 a03e2aec Mark McLoughlin
    NICState *nic;
83 fbdaa002 Gerd Hoffmann
    NICConf conf;
84 7c23b892 balrog
    int mmio_index;
85 7c23b892 balrog
86 7c23b892 balrog
    uint32_t mac_reg[0x8000];
87 7c23b892 balrog
    uint16_t phy_reg[0x20];
88 7c23b892 balrog
    uint16_t eeprom_data[64];
89 7c23b892 balrog
90 7c23b892 balrog
    uint32_t rxbuf_size;
91 7c23b892 balrog
    uint32_t rxbuf_min_shift;
92 7c23b892 balrog
    int check_rxov;
93 7c23b892 balrog
    struct e1000_tx {
94 7c23b892 balrog
        unsigned char header[256];
95 8f2e8d1f aliguori
        unsigned char vlan_header[4];
96 b10fec9b Stefan Weil
        /* Fields vlan and data must not be reordered or separated. */
97 8f2e8d1f aliguori
        unsigned char vlan[4];
98 7c23b892 balrog
        unsigned char data[0x10000];
99 7c23b892 balrog
        uint16_t size;
100 7c23b892 balrog
        unsigned char sum_needed;
101 8f2e8d1f aliguori
        unsigned char vlan_needed;
102 7c23b892 balrog
        uint8_t ipcss;
103 7c23b892 balrog
        uint8_t ipcso;
104 7c23b892 balrog
        uint16_t ipcse;
105 7c23b892 balrog
        uint8_t tucss;
106 7c23b892 balrog
        uint8_t tucso;
107 7c23b892 balrog
        uint16_t tucse;
108 7c23b892 balrog
        uint8_t hdr_len;
109 7c23b892 balrog
        uint16_t mss;
110 7c23b892 balrog
        uint32_t paylen;
111 7c23b892 balrog
        uint16_t tso_frames;
112 7c23b892 balrog
        char tse;
113 b6c4f71f blueswir1
        int8_t ip;
114 b6c4f71f blueswir1
        int8_t tcp;
115 1b0009db balrog
        char cptse;     // current packet tse bit
116 7c23b892 balrog
    } tx;
117 7c23b892 balrog
118 7c23b892 balrog
    struct {
119 7c23b892 balrog
        uint32_t val_in;        // shifted in from guest driver
120 7c23b892 balrog
        uint16_t bitnum_in;
121 7c23b892 balrog
        uint16_t bitnum_out;
122 7c23b892 balrog
        uint16_t reading;
123 7c23b892 balrog
        uint32_t old_eecd;
124 7c23b892 balrog
    } eecd_state;
125 7c23b892 balrog
} E1000State;
126 7c23b892 balrog
127 7c23b892 balrog
#define        defreg(x)        x = (E1000_##x>>2)
128 7c23b892 balrog
enum {
129 7c23b892 balrog
    defreg(CTRL),        defreg(EECD),        defreg(EERD),        defreg(GPRC),
130 7c23b892 balrog
    defreg(GPTC),        defreg(ICR),        defreg(ICS),        defreg(IMC),
131 7c23b892 balrog
    defreg(IMS),        defreg(LEDCTL),        defreg(MANC),        defreg(MDIC),
132 7c23b892 balrog
    defreg(MPC),        defreg(PBA),        defreg(RCTL),        defreg(RDBAH),
133 7c23b892 balrog
    defreg(RDBAL),        defreg(RDH),        defreg(RDLEN),        defreg(RDT),
134 7c23b892 balrog
    defreg(STATUS),        defreg(SWSM),        defreg(TCTL),        defreg(TDBAH),
135 7c23b892 balrog
    defreg(TDBAL),        defreg(TDH),        defreg(TDLEN),        defreg(TDT),
136 7c23b892 balrog
    defreg(TORH),        defreg(TORL),        defreg(TOTH),        defreg(TOTL),
137 7c23b892 balrog
    defreg(TPR),        defreg(TPT),        defreg(TXDCTL),        defreg(WUFC),
138 8f2e8d1f aliguori
    defreg(RA),                defreg(MTA),        defreg(CRCERRS),defreg(VFTA),
139 8f2e8d1f aliguori
    defreg(VET),
140 7c23b892 balrog
};
141 7c23b892 balrog
142 7c23b892 balrog
enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
143 88b4e9db blueswir1
static const char phy_regcap[0x20] = {
144 7c23b892 balrog
    [PHY_STATUS] = PHY_R,        [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
145 7c23b892 balrog
    [PHY_ID1] = PHY_R,                [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
146 7c23b892 balrog
    [PHY_CTRL] = PHY_RW,        [PHY_1000T_CTRL] = PHY_RW,
147 7c23b892 balrog
    [PHY_LP_ABILITY] = PHY_R,        [PHY_1000T_STATUS] = PHY_R,
148 7c23b892 balrog
    [PHY_AUTONEG_ADV] = PHY_RW,        [M88E1000_RX_ERR_CNTR] = PHY_R,
149 700f6e2c aurel32
    [PHY_ID2] = PHY_R,                [M88E1000_PHY_SPEC_STATUS] = PHY_R
150 7c23b892 balrog
};
151 7c23b892 balrog
152 7c23b892 balrog
static void
153 6e355d90 Isaku Yamahata
ioport_map(PCIDevice *pci_dev, int region_num, pcibus_t addr,
154 6e355d90 Isaku Yamahata
           pcibus_t size, int type)
155 7c23b892 balrog
{
156 89e8b13c Isaku Yamahata
    DBGOUT(IO, "e1000_ioport_map addr=0x%04"FMT_PCIBUS
157 89e8b13c Isaku Yamahata
           " size=0x%08"FMT_PCIBUS"\n", addr, size);
158 7c23b892 balrog
}
159 7c23b892 balrog
160 7c23b892 balrog
static void
161 7c23b892 balrog
set_interrupt_cause(E1000State *s, int index, uint32_t val)
162 7c23b892 balrog
{
163 7c23b892 balrog
    if (val)
164 7c23b892 balrog
        val |= E1000_ICR_INT_ASSERTED;
165 7c23b892 balrog
    s->mac_reg[ICR] = val;
166 b1332393 Bill Paul
    s->mac_reg[ICS] = val;
167 bc26e55a Blue Swirl
    qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
168 7c23b892 balrog
}
169 7c23b892 balrog
170 7c23b892 balrog
static void
171 7c23b892 balrog
set_ics(E1000State *s, int index, uint32_t val)
172 7c23b892 balrog
{
173 7c23b892 balrog
    DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
174 7c23b892 balrog
        s->mac_reg[IMS]);
175 7c23b892 balrog
    set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
176 7c23b892 balrog
}
177 7c23b892 balrog
178 7c23b892 balrog
static int
179 7c23b892 balrog
rxbufsize(uint32_t v)
180 7c23b892 balrog
{
181 7c23b892 balrog
    v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
182 7c23b892 balrog
         E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
183 7c23b892 balrog
         E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
184 7c23b892 balrog
    switch (v) {
185 7c23b892 balrog
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
186 7c23b892 balrog
        return 16384;
187 7c23b892 balrog
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
188 7c23b892 balrog
        return 8192;
189 7c23b892 balrog
    case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
190 7c23b892 balrog
        return 4096;
191 7c23b892 balrog
    case E1000_RCTL_SZ_1024:
192 7c23b892 balrog
        return 1024;
193 7c23b892 balrog
    case E1000_RCTL_SZ_512:
194 7c23b892 balrog
        return 512;
195 7c23b892 balrog
    case E1000_RCTL_SZ_256:
196 7c23b892 balrog
        return 256;
197 7c23b892 balrog
    }
198 7c23b892 balrog
    return 2048;
199 7c23b892 balrog
}
200 7c23b892 balrog
201 7c23b892 balrog
static void
202 cab3c825 Kevin Wolf
set_ctrl(E1000State *s, int index, uint32_t val)
203 cab3c825 Kevin Wolf
{
204 cab3c825 Kevin Wolf
    /* RST is self clearing */
205 cab3c825 Kevin Wolf
    s->mac_reg[CTRL] = val & ~E1000_CTRL_RST;
206 cab3c825 Kevin Wolf
}
207 cab3c825 Kevin Wolf
208 cab3c825 Kevin Wolf
static void
209 7c23b892 balrog
set_rx_control(E1000State *s, int index, uint32_t val)
210 7c23b892 balrog
{
211 7c23b892 balrog
    s->mac_reg[RCTL] = val;
212 7c23b892 balrog
    s->rxbuf_size = rxbufsize(val);
213 7c23b892 balrog
    s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
214 7c23b892 balrog
    DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
215 7c23b892 balrog
           s->mac_reg[RCTL]);
216 7c23b892 balrog
}
217 7c23b892 balrog
218 7c23b892 balrog
static void
219 7c23b892 balrog
set_mdic(E1000State *s, int index, uint32_t val)
220 7c23b892 balrog
{
221 7c23b892 balrog
    uint32_t data = val & E1000_MDIC_DATA_MASK;
222 7c23b892 balrog
    uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
223 7c23b892 balrog
224 7c23b892 balrog
    if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
225 7c23b892 balrog
        val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
226 7c23b892 balrog
    else if (val & E1000_MDIC_OP_READ) {
227 7c23b892 balrog
        DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
228 7c23b892 balrog
        if (!(phy_regcap[addr] & PHY_R)) {
229 7c23b892 balrog
            DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
230 7c23b892 balrog
            val |= E1000_MDIC_ERROR;
231 7c23b892 balrog
        } else
232 7c23b892 balrog
            val = (val ^ data) | s->phy_reg[addr];
233 7c23b892 balrog
    } else if (val & E1000_MDIC_OP_WRITE) {
234 7c23b892 balrog
        DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
235 7c23b892 balrog
        if (!(phy_regcap[addr] & PHY_W)) {
236 7c23b892 balrog
            DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
237 7c23b892 balrog
            val |= E1000_MDIC_ERROR;
238 7c23b892 balrog
        } else
239 7c23b892 balrog
            s->phy_reg[addr] = data;
240 7c23b892 balrog
    }
241 7c23b892 balrog
    s->mac_reg[MDIC] = val | E1000_MDIC_READY;
242 7c23b892 balrog
    set_ics(s, 0, E1000_ICR_MDAC);
243 7c23b892 balrog
}
244 7c23b892 balrog
245 7c23b892 balrog
static uint32_t
246 7c23b892 balrog
get_eecd(E1000State *s, int index)
247 7c23b892 balrog
{
248 7c23b892 balrog
    uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
249 7c23b892 balrog
250 7c23b892 balrog
    DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
251 7c23b892 balrog
           s->eecd_state.bitnum_out, s->eecd_state.reading);
252 7c23b892 balrog
    if (!s->eecd_state.reading ||
253 7c23b892 balrog
        ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
254 7c23b892 balrog
          ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
255 7c23b892 balrog
        ret |= E1000_EECD_DO;
256 7c23b892 balrog
    return ret;
257 7c23b892 balrog
}
258 7c23b892 balrog
259 7c23b892 balrog
static void
260 7c23b892 balrog
set_eecd(E1000State *s, int index, uint32_t val)
261 7c23b892 balrog
{
262 7c23b892 balrog
    uint32_t oldval = s->eecd_state.old_eecd;
263 7c23b892 balrog
264 7c23b892 balrog
    s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
265 7c23b892 balrog
            E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
266 9651ac55 Izumi Tsutsui
    if (!(E1000_EECD_CS & val))                        // CS inactive; nothing to do
267 9651ac55 Izumi Tsutsui
        return;
268 9651ac55 Izumi Tsutsui
    if (E1000_EECD_CS & (val ^ oldval)) {        // CS rise edge; reset state
269 9651ac55 Izumi Tsutsui
        s->eecd_state.val_in = 0;
270 9651ac55 Izumi Tsutsui
        s->eecd_state.bitnum_in = 0;
271 9651ac55 Izumi Tsutsui
        s->eecd_state.bitnum_out = 0;
272 9651ac55 Izumi Tsutsui
        s->eecd_state.reading = 0;
273 9651ac55 Izumi Tsutsui
    }
274 7c23b892 balrog
    if (!(E1000_EECD_SK & (val ^ oldval)))        // no clock edge
275 7c23b892 balrog
        return;
276 7c23b892 balrog
    if (!(E1000_EECD_SK & val)) {                // falling edge
277 7c23b892 balrog
        s->eecd_state.bitnum_out++;
278 7c23b892 balrog
        return;
279 7c23b892 balrog
    }
280 7c23b892 balrog
    s->eecd_state.val_in <<= 1;
281 7c23b892 balrog
    if (val & E1000_EECD_DI)
282 7c23b892 balrog
        s->eecd_state.val_in |= 1;
283 7c23b892 balrog
    if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
284 7c23b892 balrog
        s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
285 7c23b892 balrog
        s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
286 7c23b892 balrog
            EEPROM_READ_OPCODE_MICROWIRE);
287 7c23b892 balrog
    }
288 7c23b892 balrog
    DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
289 7c23b892 balrog
           s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
290 7c23b892 balrog
           s->eecd_state.reading);
291 7c23b892 balrog
}
292 7c23b892 balrog
293 7c23b892 balrog
static uint32_t
294 7c23b892 balrog
flash_eerd_read(E1000State *s, int x)
295 7c23b892 balrog
{
296 7c23b892 balrog
    unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
297 7c23b892 balrog
298 b1332393 Bill Paul
    if ((s->mac_reg[EERD] & E1000_EEPROM_RW_REG_START) == 0)
299 b1332393 Bill Paul
        return (s->mac_reg[EERD]);
300 b1332393 Bill Paul
301 7c23b892 balrog
    if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
302 b1332393 Bill Paul
        return (E1000_EEPROM_RW_REG_DONE | r);
303 b1332393 Bill Paul
304 b1332393 Bill Paul
    return ((s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
305 b1332393 Bill Paul
           E1000_EEPROM_RW_REG_DONE | r);
306 7c23b892 balrog
}
307 7c23b892 balrog
308 7c23b892 balrog
static void
309 7c23b892 balrog
putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
310 7c23b892 balrog
{
311 c6a6a5e3 aliguori
    uint32_t sum;
312 c6a6a5e3 aliguori
313 7c23b892 balrog
    if (cse && cse < n)
314 7c23b892 balrog
        n = cse + 1;
315 c6a6a5e3 aliguori
    if (sloc < n-1) {
316 c6a6a5e3 aliguori
        sum = net_checksum_add(n-css, data+css);
317 7c23b892 balrog
        cpu_to_be16wu((uint16_t *)(data + sloc),
318 c6a6a5e3 aliguori
                      net_checksum_finish(sum));
319 c6a6a5e3 aliguori
    }
320 7c23b892 balrog
}
321 7c23b892 balrog
322 8f2e8d1f aliguori
static inline int
323 8f2e8d1f aliguori
vlan_enabled(E1000State *s)
324 8f2e8d1f aliguori
{
325 8f2e8d1f aliguori
    return ((s->mac_reg[CTRL] & E1000_CTRL_VME) != 0);
326 8f2e8d1f aliguori
}
327 8f2e8d1f aliguori
328 8f2e8d1f aliguori
static inline int
329 8f2e8d1f aliguori
vlan_rx_filter_enabled(E1000State *s)
330 8f2e8d1f aliguori
{
331 8f2e8d1f aliguori
    return ((s->mac_reg[RCTL] & E1000_RCTL_VFE) != 0);
332 8f2e8d1f aliguori
}
333 8f2e8d1f aliguori
334 8f2e8d1f aliguori
static inline int
335 8f2e8d1f aliguori
is_vlan_packet(E1000State *s, const uint8_t *buf)
336 8f2e8d1f aliguori
{
337 8f2e8d1f aliguori
    return (be16_to_cpup((uint16_t *)(buf + 12)) ==
338 8f2e8d1f aliguori
                le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
339 8f2e8d1f aliguori
}
340 8f2e8d1f aliguori
341 8f2e8d1f aliguori
static inline int
342 8f2e8d1f aliguori
is_vlan_txd(uint32_t txd_lower)
343 8f2e8d1f aliguori
{
344 8f2e8d1f aliguori
    return ((txd_lower & E1000_TXD_CMD_VLE) != 0);
345 8f2e8d1f aliguori
}
346 8f2e8d1f aliguori
347 55e8d1ce Michael S. Tsirkin
/* FCS aka Ethernet CRC-32. We don't get it from backends and can't
348 55e8d1ce Michael S. Tsirkin
 * fill it in, just pad descriptor length by 4 bytes unless guest
349 a05e8a6e Michael S. Tsirkin
 * told us to strip it off the packet. */
350 55e8d1ce Michael S. Tsirkin
static inline int
351 55e8d1ce Michael S. Tsirkin
fcs_len(E1000State *s)
352 55e8d1ce Michael S. Tsirkin
{
353 55e8d1ce Michael S. Tsirkin
    return (s->mac_reg[RCTL] & E1000_RCTL_SECRC) ? 0 : 4;
354 55e8d1ce Michael S. Tsirkin
}
355 55e8d1ce Michael S. Tsirkin
356 7c23b892 balrog
static void
357 7c23b892 balrog
xmit_seg(E1000State *s)
358 7c23b892 balrog
{
359 7c23b892 balrog
    uint16_t len, *sp;
360 7c23b892 balrog
    unsigned int frames = s->tx.tso_frames, css, sofar, n;
361 7c23b892 balrog
    struct e1000_tx *tp = &s->tx;
362 7c23b892 balrog
363 1b0009db balrog
    if (tp->tse && tp->cptse) {
364 7c23b892 balrog
        css = tp->ipcss;
365 7c23b892 balrog
        DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
366 7c23b892 balrog
               frames, tp->size, css);
367 7c23b892 balrog
        if (tp->ip) {                // IPv4
368 7c23b892 balrog
            cpu_to_be16wu((uint16_t *)(tp->data+css+2),
369 7c23b892 balrog
                          tp->size - css);
370 7c23b892 balrog
            cpu_to_be16wu((uint16_t *)(tp->data+css+4),
371 7c23b892 balrog
                          be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
372 7c23b892 balrog
        } else                        // IPv6
373 7c23b892 balrog
            cpu_to_be16wu((uint16_t *)(tp->data+css+4),
374 7c23b892 balrog
                          tp->size - css);
375 7c23b892 balrog
        css = tp->tucss;
376 7c23b892 balrog
        len = tp->size - css;
377 7c23b892 balrog
        DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
378 7c23b892 balrog
        if (tp->tcp) {
379 7c23b892 balrog
            sofar = frames * tp->mss;
380 7c23b892 balrog
            cpu_to_be32wu((uint32_t *)(tp->data+css+4),        // seq
381 88738c09 aurel32
                be32_to_cpupu((uint32_t *)(tp->data+css+4))+sofar);
382 7c23b892 balrog
            if (tp->paylen - sofar > tp->mss)
383 7c23b892 balrog
                tp->data[css + 13] &= ~9;                // PSH, FIN
384 7c23b892 balrog
        } else        // UDP
385 7c23b892 balrog
            cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
386 7c23b892 balrog
        if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
387 1f892feb Alex Williamson
            unsigned int phsum;
388 7c23b892 balrog
            // add pseudo-header length before checksum calculation
389 7c23b892 balrog
            sp = (uint16_t *)(tp->data + tp->tucso);
390 1f892feb Alex Williamson
            phsum = be16_to_cpup(sp) + len;
391 1f892feb Alex Williamson
            phsum = (phsum >> 16) + (phsum & 0xffff);
392 1f892feb Alex Williamson
            cpu_to_be16wu(sp, phsum);
393 7c23b892 balrog
        }
394 7c23b892 balrog
        tp->tso_frames++;
395 7c23b892 balrog
    }
396 7c23b892 balrog
397 7c23b892 balrog
    if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
398 7c23b892 balrog
        putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
399 7c23b892 balrog
    if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
400 7c23b892 balrog
        putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
401 8f2e8d1f aliguori
    if (tp->vlan_needed) {
402 b10fec9b Stefan Weil
        memmove(tp->vlan, tp->data, 4);
403 b10fec9b Stefan Weil
        memmove(tp->data, tp->data + 4, 8);
404 8f2e8d1f aliguori
        memcpy(tp->data + 8, tp->vlan_header, 4);
405 a03e2aec Mark McLoughlin
        qemu_send_packet(&s->nic->nc, tp->vlan, tp->size + 4);
406 8f2e8d1f aliguori
    } else
407 a03e2aec Mark McLoughlin
        qemu_send_packet(&s->nic->nc, tp->data, tp->size);
408 7c23b892 balrog
    s->mac_reg[TPT]++;
409 7c23b892 balrog
    s->mac_reg[GPTC]++;
410 7c23b892 balrog
    n = s->mac_reg[TOTL];
411 7c23b892 balrog
    if ((s->mac_reg[TOTL] += s->tx.size) < n)
412 7c23b892 balrog
        s->mac_reg[TOTH]++;
413 7c23b892 balrog
}
414 7c23b892 balrog
415 7c23b892 balrog
static void
416 7c23b892 balrog
process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
417 7c23b892 balrog
{
418 7c23b892 balrog
    uint32_t txd_lower = le32_to_cpu(dp->lower.data);
419 7c23b892 balrog
    uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
420 7c23b892 balrog
    unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
421 7c23b892 balrog
    unsigned int msh = 0xfffff, hdr = 0;
422 7c23b892 balrog
    uint64_t addr;
423 7c23b892 balrog
    struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
424 7c23b892 balrog
    struct e1000_tx *tp = &s->tx;
425 7c23b892 balrog
426 7c23b892 balrog
    if (dtype == E1000_TXD_CMD_DEXT) {        // context descriptor
427 7c23b892 balrog
        op = le32_to_cpu(xp->cmd_and_length);
428 7c23b892 balrog
        tp->ipcss = xp->lower_setup.ip_fields.ipcss;
429 7c23b892 balrog
        tp->ipcso = xp->lower_setup.ip_fields.ipcso;
430 7c23b892 balrog
        tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
431 7c23b892 balrog
        tp->tucss = xp->upper_setup.tcp_fields.tucss;
432 7c23b892 balrog
        tp->tucso = xp->upper_setup.tcp_fields.tucso;
433 7c23b892 balrog
        tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
434 7c23b892 balrog
        tp->paylen = op & 0xfffff;
435 7c23b892 balrog
        tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
436 7c23b892 balrog
        tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
437 7c23b892 balrog
        tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
438 7c23b892 balrog
        tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
439 7c23b892 balrog
        tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
440 7c23b892 balrog
        tp->tso_frames = 0;
441 7c23b892 balrog
        if (tp->tucso == 0) {        // this is probably wrong
442 7c23b892 balrog
            DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
443 7c23b892 balrog
            tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
444 7c23b892 balrog
        }
445 7c23b892 balrog
        return;
446 1b0009db balrog
    } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
447 1b0009db balrog
        // data descriptor
448 7c23b892 balrog
        tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
449 1b0009db balrog
        tp->cptse = ( txd_lower & E1000_TXD_CMD_TSE ) ? 1 : 0;
450 43ad7e3e Jes Sorensen
    } else {
451 1b0009db balrog
        // legacy descriptor
452 1b0009db balrog
        tp->cptse = 0;
453 43ad7e3e Jes Sorensen
    }
454 7c23b892 balrog
455 8f2e8d1f aliguori
    if (vlan_enabled(s) && is_vlan_txd(txd_lower) &&
456 8f2e8d1f aliguori
        (tp->cptse || txd_lower & E1000_TXD_CMD_EOP)) {
457 8f2e8d1f aliguori
        tp->vlan_needed = 1;
458 8f2e8d1f aliguori
        cpu_to_be16wu((uint16_t *)(tp->vlan_header),
459 8f2e8d1f aliguori
                      le16_to_cpup((uint16_t *)(s->mac_reg + VET)));
460 8f2e8d1f aliguori
        cpu_to_be16wu((uint16_t *)(tp->vlan_header + 2),
461 8f2e8d1f aliguori
                      le16_to_cpu(dp->upper.fields.special));
462 8f2e8d1f aliguori
    }
463 8f2e8d1f aliguori
        
464 7c23b892 balrog
    addr = le64_to_cpu(dp->buffer_addr);
465 1b0009db balrog
    if (tp->tse && tp->cptse) {
466 7c23b892 balrog
        hdr = tp->hdr_len;
467 7c23b892 balrog
        msh = hdr + tp->mss;
468 1b0009db balrog
        do {
469 1b0009db balrog
            bytes = split_size;
470 1b0009db balrog
            if (tp->size + bytes > msh)
471 1b0009db balrog
                bytes = msh - tp->size;
472 1b0009db balrog
            cpu_physical_memory_read(addr, tp->data + tp->size, bytes);
473 1b0009db balrog
            if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
474 1b0009db balrog
                memmove(tp->header, tp->data, hdr);
475 1b0009db balrog
            tp->size = sz;
476 1b0009db balrog
            addr += bytes;
477 1b0009db balrog
            if (sz == msh) {
478 1b0009db balrog
                xmit_seg(s);
479 1b0009db balrog
                memmove(tp->data, tp->header, hdr);
480 1b0009db balrog
                tp->size = hdr;
481 1b0009db balrog
            }
482 1b0009db balrog
        } while (split_size -= bytes);
483 1b0009db balrog
    } else if (!tp->tse && tp->cptse) {
484 1b0009db balrog
        // context descriptor TSE is not set, while data descriptor TSE is set
485 1b0009db balrog
        DBGOUT(TXERR, "TCP segmentaion Error\n");
486 1b0009db balrog
    } else {
487 1b0009db balrog
        cpu_physical_memory_read(addr, tp->data + tp->size, split_size);
488 1b0009db balrog
        tp->size += split_size;
489 7c23b892 balrog
    }
490 7c23b892 balrog
491 7c23b892 balrog
    if (!(txd_lower & E1000_TXD_CMD_EOP))
492 7c23b892 balrog
        return;
493 1b0009db balrog
    if (!(tp->tse && tp->cptse && tp->size < hdr))
494 7c23b892 balrog
        xmit_seg(s);
495 7c23b892 balrog
    tp->tso_frames = 0;
496 7c23b892 balrog
    tp->sum_needed = 0;
497 8f2e8d1f aliguori
    tp->vlan_needed = 0;
498 7c23b892 balrog
    tp->size = 0;
499 1b0009db balrog
    tp->cptse = 0;
500 7c23b892 balrog
}
501 7c23b892 balrog
502 7c23b892 balrog
static uint32_t
503 c227f099 Anthony Liguori
txdesc_writeback(target_phys_addr_t base, struct e1000_tx_desc *dp)
504 7c23b892 balrog
{
505 7c23b892 balrog
    uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
506 7c23b892 balrog
507 7c23b892 balrog
    if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
508 7c23b892 balrog
        return 0;
509 7c23b892 balrog
    txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
510 7c23b892 balrog
                ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
511 7c23b892 balrog
    dp->upper.data = cpu_to_le32(txd_upper);
512 7c23b892 balrog
    cpu_physical_memory_write(base + ((char *)&dp->upper - (char *)dp),
513 7c23b892 balrog
                              (void *)&dp->upper, sizeof(dp->upper));
514 7c23b892 balrog
    return E1000_ICR_TXDW;
515 7c23b892 balrog
}
516 7c23b892 balrog
517 7c23b892 balrog
static void
518 7c23b892 balrog
start_xmit(E1000State *s)
519 7c23b892 balrog
{
520 c227f099 Anthony Liguori
    target_phys_addr_t base;
521 7c23b892 balrog
    struct e1000_tx_desc desc;
522 7c23b892 balrog
    uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
523 7c23b892 balrog
524 7c23b892 balrog
    if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
525 7c23b892 balrog
        DBGOUT(TX, "tx disabled\n");
526 7c23b892 balrog
        return;
527 7c23b892 balrog
    }
528 7c23b892 balrog
529 7c23b892 balrog
    while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
530 7c23b892 balrog
        base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
531 7c23b892 balrog
               sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
532 7c23b892 balrog
        cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
533 7c23b892 balrog
534 7c23b892 balrog
        DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
535 6106075b ths
               (void *)(intptr_t)desc.buffer_addr, desc.lower.data,
536 7c23b892 balrog
               desc.upper.data);
537 7c23b892 balrog
538 7c23b892 balrog
        process_tx_desc(s, &desc);
539 7c23b892 balrog
        cause |= txdesc_writeback(base, &desc);
540 7c23b892 balrog
541 7c23b892 balrog
        if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
542 7c23b892 balrog
            s->mac_reg[TDH] = 0;
543 7c23b892 balrog
        /*
544 7c23b892 balrog
         * the following could happen only if guest sw assigns
545 7c23b892 balrog
         * bogus values to TDT/TDLEN.
546 7c23b892 balrog
         * there's nothing too intelligent we could do about this.
547 7c23b892 balrog
         */
548 7c23b892 balrog
        if (s->mac_reg[TDH] == tdh_start) {
549 7c23b892 balrog
            DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
550 7c23b892 balrog
                   tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
551 7c23b892 balrog
            break;
552 7c23b892 balrog
        }
553 7c23b892 balrog
    }
554 7c23b892 balrog
    set_ics(s, 0, cause);
555 7c23b892 balrog
}
556 7c23b892 balrog
557 7c23b892 balrog
static int
558 7c23b892 balrog
receive_filter(E1000State *s, const uint8_t *buf, int size)
559 7c23b892 balrog
{
560 af2960f9 Blue Swirl
    static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
561 af2960f9 Blue Swirl
    static const int mta_shift[] = {4, 3, 2, 0};
562 7c23b892 balrog
    uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
563 7c23b892 balrog
564 8f2e8d1f aliguori
    if (is_vlan_packet(s, buf) && vlan_rx_filter_enabled(s)) {
565 8f2e8d1f aliguori
        uint16_t vid = be16_to_cpup((uint16_t *)(buf + 14));
566 8f2e8d1f aliguori
        uint32_t vfta = le32_to_cpup((uint32_t *)(s->mac_reg + VFTA) +
567 8f2e8d1f aliguori
                                     ((vid >> 5) & 0x7f));
568 8f2e8d1f aliguori
        if ((vfta & (1 << (vid & 0x1f))) == 0)
569 8f2e8d1f aliguori
            return 0;
570 8f2e8d1f aliguori
    }
571 8f2e8d1f aliguori
572 7c23b892 balrog
    if (rctl & E1000_RCTL_UPE)                        // promiscuous
573 7c23b892 balrog
        return 1;
574 7c23b892 balrog
575 7c23b892 balrog
    if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE))        // promiscuous mcast
576 7c23b892 balrog
        return 1;
577 7c23b892 balrog
578 7c23b892 balrog
    if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
579 7c23b892 balrog
        return 1;
580 7c23b892 balrog
581 7c23b892 balrog
    for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
582 7c23b892 balrog
        if (!(rp[1] & E1000_RAH_AV))
583 7c23b892 balrog
            continue;
584 7c23b892 balrog
        ra[0] = cpu_to_le32(rp[0]);
585 7c23b892 balrog
        ra[1] = cpu_to_le32(rp[1]);
586 7c23b892 balrog
        if (!memcmp(buf, (uint8_t *)ra, 6)) {
587 7c23b892 balrog
            DBGOUT(RXFILTER,
588 7c23b892 balrog
                   "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
589 7c23b892 balrog
                   (int)(rp - s->mac_reg - RA)/2,
590 7c23b892 balrog
                   buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
591 7c23b892 balrog
            return 1;
592 7c23b892 balrog
        }
593 7c23b892 balrog
    }
594 7c23b892 balrog
    DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
595 7c23b892 balrog
           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
596 7c23b892 balrog
597 7c23b892 balrog
    f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
598 7c23b892 balrog
    f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
599 7c23b892 balrog
    if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
600 7c23b892 balrog
        return 1;
601 7c23b892 balrog
    DBGOUT(RXFILTER,
602 7c23b892 balrog
           "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
603 7c23b892 balrog
           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
604 7c23b892 balrog
           (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
605 7c23b892 balrog
           s->mac_reg[MTA + (f >> 5)]);
606 7c23b892 balrog
607 7c23b892 balrog
    return 0;
608 7c23b892 balrog
}
609 7c23b892 balrog
610 99ed7e30 aliguori
static void
611 a03e2aec Mark McLoughlin
e1000_set_link_status(VLANClientState *nc)
612 99ed7e30 aliguori
{
613 a03e2aec Mark McLoughlin
    E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
614 99ed7e30 aliguori
    uint32_t old_status = s->mac_reg[STATUS];
615 99ed7e30 aliguori
616 a03e2aec Mark McLoughlin
    if (nc->link_down)
617 99ed7e30 aliguori
        s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
618 99ed7e30 aliguori
    else
619 99ed7e30 aliguori
        s->mac_reg[STATUS] |= E1000_STATUS_LU;
620 99ed7e30 aliguori
621 99ed7e30 aliguori
    if (s->mac_reg[STATUS] != old_status)
622 99ed7e30 aliguori
        set_ics(s, 0, E1000_ICR_LSC);
623 99ed7e30 aliguori
}
624 99ed7e30 aliguori
625 7c23b892 balrog
static int
626 a03e2aec Mark McLoughlin
e1000_can_receive(VLANClientState *nc)
627 7c23b892 balrog
{
628 a03e2aec Mark McLoughlin
    E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
629 7c23b892 balrog
630 4105de67 aliguori
    return (s->mac_reg[RCTL] & E1000_RCTL_EN);
631 7c23b892 balrog
}
632 7c23b892 balrog
633 4f1c942b Mark McLoughlin
static ssize_t
634 a03e2aec Mark McLoughlin
e1000_receive(VLANClientState *nc, const uint8_t *buf, size_t size)
635 7c23b892 balrog
{
636 a03e2aec Mark McLoughlin
    E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
637 7c23b892 balrog
    struct e1000_rx_desc desc;
638 c227f099 Anthony Liguori
    target_phys_addr_t base;
639 7c23b892 balrog
    unsigned int n, rdt;
640 7c23b892 balrog
    uint32_t rdh_start;
641 8f2e8d1f aliguori
    uint16_t vlan_special = 0;
642 8f2e8d1f aliguori
    uint8_t vlan_status = 0, vlan_offset = 0;
643 78aeb23e Stefan Hajnoczi
    uint8_t min_buf[MIN_BUF_SIZE];
644 7c23b892 balrog
645 7c23b892 balrog
    if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
646 4f1c942b Mark McLoughlin
        return -1;
647 7c23b892 balrog
648 78aeb23e Stefan Hajnoczi
    /* Pad to minimum Ethernet frame length */
649 78aeb23e Stefan Hajnoczi
    if (size < sizeof(min_buf)) {
650 78aeb23e Stefan Hajnoczi
        memcpy(min_buf, buf, size);
651 78aeb23e Stefan Hajnoczi
        memset(&min_buf[size], 0, sizeof(min_buf) - size);
652 78aeb23e Stefan Hajnoczi
        buf = min_buf;
653 78aeb23e Stefan Hajnoczi
        size = sizeof(min_buf);
654 78aeb23e Stefan Hajnoczi
    }
655 78aeb23e Stefan Hajnoczi
656 7c23b892 balrog
    if (size > s->rxbuf_size) {
657 cda9046b Mark McLoughlin
        DBGOUT(RX, "packet too large for buffers (%lu > %d)\n",
658 cda9046b Mark McLoughlin
               (unsigned long)size, s->rxbuf_size);
659 4f1c942b Mark McLoughlin
        return -1;
660 7c23b892 balrog
    }
661 7c23b892 balrog
662 7c23b892 balrog
    if (!receive_filter(s, buf, size))
663 4f1c942b Mark McLoughlin
        return size;
664 7c23b892 balrog
665 8f2e8d1f aliguori
    if (vlan_enabled(s) && is_vlan_packet(s, buf)) {
666 8f2e8d1f aliguori
        vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14)));
667 98835fe3 Thomas Monjalon
        memmove((uint8_t *)buf + 4, buf, 12);
668 8f2e8d1f aliguori
        vlan_status = E1000_RXD_STAT_VP;
669 8f2e8d1f aliguori
        vlan_offset = 4;
670 8f2e8d1f aliguori
        size -= 4;
671 8f2e8d1f aliguori
    }
672 8f2e8d1f aliguori
673 7c23b892 balrog
    rdh_start = s->mac_reg[RDH];
674 7c23b892 balrog
    do {
675 7c23b892 balrog
        if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) {
676 7c23b892 balrog
            set_ics(s, 0, E1000_ICS_RXO);
677 4f1c942b Mark McLoughlin
            return -1;
678 7c23b892 balrog
        }
679 7c23b892 balrog
        base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
680 7c23b892 balrog
               sizeof(desc) * s->mac_reg[RDH];
681 7c23b892 balrog
        cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
682 8f2e8d1f aliguori
        desc.special = vlan_special;
683 8f2e8d1f aliguori
        desc.status |= (vlan_status | E1000_RXD_STAT_DD);
684 7c23b892 balrog
        if (desc.buffer_addr) {
685 7c23b892 balrog
            cpu_physical_memory_write(le64_to_cpu(desc.buffer_addr),
686 8f2e8d1f aliguori
                                      (void *)(buf + vlan_offset), size);
687 55e8d1ce Michael S. Tsirkin
            desc.length = cpu_to_le16(size + fcs_len(s));
688 7c23b892 balrog
            desc.status |= E1000_RXD_STAT_EOP|E1000_RXD_STAT_IXSM;
689 43ad7e3e Jes Sorensen
        } else { // as per intel docs; skip descriptors with null buf addr
690 7c23b892 balrog
            DBGOUT(RX, "Null RX descriptor!!\n");
691 43ad7e3e Jes Sorensen
        }
692 7c23b892 balrog
        cpu_physical_memory_write(base, (void *)&desc, sizeof(desc));
693 7c23b892 balrog
694 7c23b892 balrog
        if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
695 7c23b892 balrog
            s->mac_reg[RDH] = 0;
696 7c23b892 balrog
        s->check_rxov = 1;
697 7c23b892 balrog
        /* see comment in start_xmit; same here */
698 7c23b892 balrog
        if (s->mac_reg[RDH] == rdh_start) {
699 7c23b892 balrog
            DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
700 7c23b892 balrog
                   rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
701 7c23b892 balrog
            set_ics(s, 0, E1000_ICS_RXO);
702 4f1c942b Mark McLoughlin
            return -1;
703 7c23b892 balrog
        }
704 7c23b892 balrog
    } while (desc.buffer_addr == 0);
705 7c23b892 balrog
706 7c23b892 balrog
    s->mac_reg[GPRC]++;
707 7c23b892 balrog
    s->mac_reg[TPR]++;
708 a05e8a6e Michael S. Tsirkin
    /* TOR - Total Octets Received:
709 a05e8a6e Michael S. Tsirkin
     * This register includes bytes received in a packet from the <Destination
710 a05e8a6e Michael S. Tsirkin
     * Address> field through the <CRC> field, inclusively.
711 a05e8a6e Michael S. Tsirkin
     */
712 a05e8a6e Michael S. Tsirkin
    n = s->mac_reg[TORL] + size + /* Always include FCS length. */ 4;
713 a05e8a6e Michael S. Tsirkin
    if (n < s->mac_reg[TORL])
714 7c23b892 balrog
        s->mac_reg[TORH]++;
715 a05e8a6e Michael S. Tsirkin
    s->mac_reg[TORL] = n;
716 7c23b892 balrog
717 7c23b892 balrog
    n = E1000_ICS_RXT0;
718 7c23b892 balrog
    if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
719 7c23b892 balrog
        rdt += s->mac_reg[RDLEN] / sizeof(desc);
720 bf16cc8f aliguori
    if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
721 bf16cc8f aliguori
        s->rxbuf_min_shift)
722 7c23b892 balrog
        n |= E1000_ICS_RXDMT0;
723 7c23b892 balrog
724 7c23b892 balrog
    set_ics(s, 0, n);
725 4f1c942b Mark McLoughlin
726 4f1c942b Mark McLoughlin
    return size;
727 7c23b892 balrog
}
728 7c23b892 balrog
729 7c23b892 balrog
static uint32_t
730 7c23b892 balrog
mac_readreg(E1000State *s, int index)
731 7c23b892 balrog
{
732 7c23b892 balrog
    return s->mac_reg[index];
733 7c23b892 balrog
}
734 7c23b892 balrog
735 7c23b892 balrog
static uint32_t
736 7c23b892 balrog
mac_icr_read(E1000State *s, int index)
737 7c23b892 balrog
{
738 7c23b892 balrog
    uint32_t ret = s->mac_reg[ICR];
739 7c23b892 balrog
740 7c23b892 balrog
    DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
741 7c23b892 balrog
    set_interrupt_cause(s, 0, 0);
742 7c23b892 balrog
    return ret;
743 7c23b892 balrog
}
744 7c23b892 balrog
745 7c23b892 balrog
static uint32_t
746 7c23b892 balrog
mac_read_clr4(E1000State *s, int index)
747 7c23b892 balrog
{
748 7c23b892 balrog
    uint32_t ret = s->mac_reg[index];
749 7c23b892 balrog
750 7c23b892 balrog
    s->mac_reg[index] = 0;
751 7c23b892 balrog
    return ret;
752 7c23b892 balrog
}
753 7c23b892 balrog
754 7c23b892 balrog
static uint32_t
755 7c23b892 balrog
mac_read_clr8(E1000State *s, int index)
756 7c23b892 balrog
{
757 7c23b892 balrog
    uint32_t ret = s->mac_reg[index];
758 7c23b892 balrog
759 7c23b892 balrog
    s->mac_reg[index] = 0;
760 7c23b892 balrog
    s->mac_reg[index-1] = 0;
761 7c23b892 balrog
    return ret;
762 7c23b892 balrog
}
763 7c23b892 balrog
764 7c23b892 balrog
static void
765 7c23b892 balrog
mac_writereg(E1000State *s, int index, uint32_t val)
766 7c23b892 balrog
{
767 7c23b892 balrog
    s->mac_reg[index] = val;
768 7c23b892 balrog
}
769 7c23b892 balrog
770 7c23b892 balrog
static void
771 7c23b892 balrog
set_rdt(E1000State *s, int index, uint32_t val)
772 7c23b892 balrog
{
773 7c23b892 balrog
    s->check_rxov = 0;
774 7c23b892 balrog
    s->mac_reg[index] = val & 0xffff;
775 7c23b892 balrog
}
776 7c23b892 balrog
777 7c23b892 balrog
static void
778 7c23b892 balrog
set_16bit(E1000State *s, int index, uint32_t val)
779 7c23b892 balrog
{
780 7c23b892 balrog
    s->mac_reg[index] = val & 0xffff;
781 7c23b892 balrog
}
782 7c23b892 balrog
783 7c23b892 balrog
static void
784 7c23b892 balrog
set_dlen(E1000State *s, int index, uint32_t val)
785 7c23b892 balrog
{
786 7c23b892 balrog
    s->mac_reg[index] = val & 0xfff80;
787 7c23b892 balrog
}
788 7c23b892 balrog
789 7c23b892 balrog
static void
790 7c23b892 balrog
set_tctl(E1000State *s, int index, uint32_t val)
791 7c23b892 balrog
{
792 7c23b892 balrog
    s->mac_reg[index] = val;
793 7c23b892 balrog
    s->mac_reg[TDT] &= 0xffff;
794 7c23b892 balrog
    start_xmit(s);
795 7c23b892 balrog
}
796 7c23b892 balrog
797 7c23b892 balrog
static void
798 7c23b892 balrog
set_icr(E1000State *s, int index, uint32_t val)
799 7c23b892 balrog
{
800 7c23b892 balrog
    DBGOUT(INTERRUPT, "set_icr %x\n", val);
801 7c23b892 balrog
    set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
802 7c23b892 balrog
}
803 7c23b892 balrog
804 7c23b892 balrog
static void
805 7c23b892 balrog
set_imc(E1000State *s, int index, uint32_t val)
806 7c23b892 balrog
{
807 7c23b892 balrog
    s->mac_reg[IMS] &= ~val;
808 7c23b892 balrog
    set_ics(s, 0, 0);
809 7c23b892 balrog
}
810 7c23b892 balrog
811 7c23b892 balrog
static void
812 7c23b892 balrog
set_ims(E1000State *s, int index, uint32_t val)
813 7c23b892 balrog
{
814 7c23b892 balrog
    s->mac_reg[IMS] |= val;
815 7c23b892 balrog
    set_ics(s, 0, 0);
816 7c23b892 balrog
}
817 7c23b892 balrog
818 7c23b892 balrog
#define getreg(x)        [x] = mac_readreg
819 7c23b892 balrog
static uint32_t (*macreg_readops[])(E1000State *, int) = {
820 7c23b892 balrog
    getreg(PBA),        getreg(RCTL),        getreg(TDH),        getreg(TXDCTL),
821 7c23b892 balrog
    getreg(WUFC),        getreg(TDT),        getreg(CTRL),        getreg(LEDCTL),
822 7c23b892 balrog
    getreg(MANC),        getreg(MDIC),        getreg(SWSM),        getreg(STATUS),
823 7c23b892 balrog
    getreg(TORL),        getreg(TOTL),        getreg(IMS),        getreg(TCTL),
824 b1332393 Bill Paul
    getreg(RDH),        getreg(RDT),        getreg(VET),        getreg(ICS),
825 a00b2335 Kay Ackermann
    getreg(TDBAL),        getreg(TDBAH),        getreg(RDBAH),        getreg(RDBAL),
826 a00b2335 Kay Ackermann
    getreg(TDLEN),        getreg(RDLEN),
827 7c23b892 balrog
828 7c23b892 balrog
    [TOTH] = mac_read_clr8,        [TORH] = mac_read_clr8,        [GPRC] = mac_read_clr4,
829 7c23b892 balrog
    [GPTC] = mac_read_clr4,        [TPR] = mac_read_clr4,        [TPT] = mac_read_clr4,
830 7c23b892 balrog
    [ICR] = mac_icr_read,        [EECD] = get_eecd,        [EERD] = flash_eerd_read,
831 7c23b892 balrog
    [CRCERRS ... MPC] = &mac_readreg,
832 7c23b892 balrog
    [RA ... RA+31] = &mac_readreg,
833 7c23b892 balrog
    [MTA ... MTA+127] = &mac_readreg,
834 8f2e8d1f aliguori
    [VFTA ... VFTA+127] = &mac_readreg,
835 7c23b892 balrog
};
836 b1503cda malc
enum { NREADOPS = ARRAY_SIZE(macreg_readops) };
837 7c23b892 balrog
838 7c23b892 balrog
#define putreg(x)        [x] = mac_writereg
839 7c23b892 balrog
static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
840 7c23b892 balrog
    putreg(PBA),        putreg(EERD),        putreg(SWSM),        putreg(WUFC),
841 7c23b892 balrog
    putreg(TDBAL),        putreg(TDBAH),        putreg(TXDCTL),        putreg(RDBAH),
842 cab3c825 Kevin Wolf
    putreg(RDBAL),        putreg(LEDCTL), putreg(VET),
843 7c23b892 balrog
    [TDLEN] = set_dlen,        [RDLEN] = set_dlen,        [TCTL] = set_tctl,
844 7c23b892 balrog
    [TDT] = set_tctl,        [MDIC] = set_mdic,        [ICS] = set_ics,
845 7c23b892 balrog
    [TDH] = set_16bit,        [RDH] = set_16bit,        [RDT] = set_rdt,
846 7c23b892 balrog
    [IMC] = set_imc,        [IMS] = set_ims,        [ICR] = set_icr,
847 cab3c825 Kevin Wolf
    [EECD] = set_eecd,        [RCTL] = set_rx_control, [CTRL] = set_ctrl,
848 7c23b892 balrog
    [RA ... RA+31] = &mac_writereg,
849 7c23b892 balrog
    [MTA ... MTA+127] = &mac_writereg,
850 8f2e8d1f aliguori
    [VFTA ... VFTA+127] = &mac_writereg,
851 7c23b892 balrog
};
852 b1503cda malc
enum { NWRITEOPS = ARRAY_SIZE(macreg_writeops) };
853 7c23b892 balrog
854 7c23b892 balrog
static void
855 c227f099 Anthony Liguori
e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
856 7c23b892 balrog
{
857 7c23b892 balrog
    E1000State *s = opaque;
858 8da3ff18 pbrook
    unsigned int index = (addr & 0x1ffff) >> 2;
859 7c23b892 balrog
860 6b59fc74 aurel32
#ifdef TARGET_WORDS_BIGENDIAN
861 6b59fc74 aurel32
    val = bswap32(val);
862 6b59fc74 aurel32
#endif
863 43ad7e3e Jes Sorensen
    if (index < NWRITEOPS && macreg_writeops[index]) {
864 6b59fc74 aurel32
        macreg_writeops[index](s, index, val);
865 43ad7e3e Jes Sorensen
    } else if (index < NREADOPS && macreg_readops[index]) {
866 7c23b892 balrog
        DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04x\n", index<<2, val);
867 43ad7e3e Jes Sorensen
    } else {
868 7c23b892 balrog
        DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
869 7c23b892 balrog
               index<<2, val);
870 43ad7e3e Jes Sorensen
    }
871 7c23b892 balrog
}
872 7c23b892 balrog
873 7c23b892 balrog
static void
874 c227f099 Anthony Liguori
e1000_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
875 7c23b892 balrog
{
876 7c23b892 balrog
    // emulate hw without byte enables: no RMW
877 7c23b892 balrog
    e1000_mmio_writel(opaque, addr & ~3,
878 6b59fc74 aurel32
                      (val & 0xffff) << (8*(addr & 3)));
879 7c23b892 balrog
}
880 7c23b892 balrog
881 7c23b892 balrog
static void
882 c227f099 Anthony Liguori
e1000_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
883 7c23b892 balrog
{
884 7c23b892 balrog
    // emulate hw without byte enables: no RMW
885 7c23b892 balrog
    e1000_mmio_writel(opaque, addr & ~3,
886 6b59fc74 aurel32
                      (val & 0xff) << (8*(addr & 3)));
887 7c23b892 balrog
}
888 7c23b892 balrog
889 7c23b892 balrog
static uint32_t
890 c227f099 Anthony Liguori
e1000_mmio_readl(void *opaque, target_phys_addr_t addr)
891 7c23b892 balrog
{
892 7c23b892 balrog
    E1000State *s = opaque;
893 8da3ff18 pbrook
    unsigned int index = (addr & 0x1ffff) >> 2;
894 7c23b892 balrog
895 7c23b892 balrog
    if (index < NREADOPS && macreg_readops[index])
896 6b59fc74 aurel32
    {
897 6b59fc74 aurel32
        uint32_t val = macreg_readops[index](s, index);
898 6b59fc74 aurel32
#ifdef TARGET_WORDS_BIGENDIAN
899 6b59fc74 aurel32
        val = bswap32(val);
900 6b59fc74 aurel32
#endif
901 6b59fc74 aurel32
        return val;
902 6b59fc74 aurel32
    }
903 7c23b892 balrog
    DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
904 7c23b892 balrog
    return 0;
905 7c23b892 balrog
}
906 7c23b892 balrog
907 7c23b892 balrog
static uint32_t
908 c227f099 Anthony Liguori
e1000_mmio_readb(void *opaque, target_phys_addr_t addr)
909 7c23b892 balrog
{
910 6b59fc74 aurel32
    return ((e1000_mmio_readl(opaque, addr & ~3)) >>
911 7c23b892 balrog
            (8 * (addr & 3))) & 0xff;
912 7c23b892 balrog
}
913 7c23b892 balrog
914 7c23b892 balrog
static uint32_t
915 c227f099 Anthony Liguori
e1000_mmio_readw(void *opaque, target_phys_addr_t addr)
916 7c23b892 balrog
{
917 6b59fc74 aurel32
    return ((e1000_mmio_readl(opaque, addr & ~3)) >>
918 6b59fc74 aurel32
            (8 * (addr & 3))) & 0xffff;
919 7c23b892 balrog
}
920 7c23b892 balrog
921 e482dc3e Juan Quintela
static bool is_version_1(void *opaque, int version_id)
922 7c23b892 balrog
{
923 e482dc3e Juan Quintela
    return version_id == 1;
924 7c23b892 balrog
}
925 7c23b892 balrog
926 e482dc3e Juan Quintela
static const VMStateDescription vmstate_e1000 = {
927 e482dc3e Juan Quintela
    .name = "e1000",
928 e482dc3e Juan Quintela
    .version_id = 2,
929 e482dc3e Juan Quintela
    .minimum_version_id = 1,
930 e482dc3e Juan Quintela
    .minimum_version_id_old = 1,
931 e482dc3e Juan Quintela
    .fields      = (VMStateField []) {
932 e482dc3e Juan Quintela
        VMSTATE_PCI_DEVICE(dev, E1000State),
933 e482dc3e Juan Quintela
        VMSTATE_UNUSED_TEST(is_version_1, 4), /* was instance id */
934 e482dc3e Juan Quintela
        VMSTATE_UNUSED(4), /* Was mmio_base.  */
935 e482dc3e Juan Quintela
        VMSTATE_UINT32(rxbuf_size, E1000State),
936 e482dc3e Juan Quintela
        VMSTATE_UINT32(rxbuf_min_shift, E1000State),
937 e482dc3e Juan Quintela
        VMSTATE_UINT32(eecd_state.val_in, E1000State),
938 e482dc3e Juan Quintela
        VMSTATE_UINT16(eecd_state.bitnum_in, E1000State),
939 e482dc3e Juan Quintela
        VMSTATE_UINT16(eecd_state.bitnum_out, E1000State),
940 e482dc3e Juan Quintela
        VMSTATE_UINT16(eecd_state.reading, E1000State),
941 e482dc3e Juan Quintela
        VMSTATE_UINT32(eecd_state.old_eecd, E1000State),
942 e482dc3e Juan Quintela
        VMSTATE_UINT8(tx.ipcss, E1000State),
943 e482dc3e Juan Quintela
        VMSTATE_UINT8(tx.ipcso, E1000State),
944 e482dc3e Juan Quintela
        VMSTATE_UINT16(tx.ipcse, E1000State),
945 e482dc3e Juan Quintela
        VMSTATE_UINT8(tx.tucss, E1000State),
946 e482dc3e Juan Quintela
        VMSTATE_UINT8(tx.tucso, E1000State),
947 e482dc3e Juan Quintela
        VMSTATE_UINT16(tx.tucse, E1000State),
948 e482dc3e Juan Quintela
        VMSTATE_UINT32(tx.paylen, E1000State),
949 e482dc3e Juan Quintela
        VMSTATE_UINT8(tx.hdr_len, E1000State),
950 e482dc3e Juan Quintela
        VMSTATE_UINT16(tx.mss, E1000State),
951 e482dc3e Juan Quintela
        VMSTATE_UINT16(tx.size, E1000State),
952 e482dc3e Juan Quintela
        VMSTATE_UINT16(tx.tso_frames, E1000State),
953 e482dc3e Juan Quintela
        VMSTATE_UINT8(tx.sum_needed, E1000State),
954 e482dc3e Juan Quintela
        VMSTATE_INT8(tx.ip, E1000State),
955 e482dc3e Juan Quintela
        VMSTATE_INT8(tx.tcp, E1000State),
956 e482dc3e Juan Quintela
        VMSTATE_BUFFER(tx.header, E1000State),
957 e482dc3e Juan Quintela
        VMSTATE_BUFFER(tx.data, E1000State),
958 e482dc3e Juan Quintela
        VMSTATE_UINT16_ARRAY(eeprom_data, E1000State, 64),
959 e482dc3e Juan Quintela
        VMSTATE_UINT16_ARRAY(phy_reg, E1000State, 0x20),
960 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[CTRL], E1000State),
961 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[EECD], E1000State),
962 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[EERD], E1000State),
963 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[GPRC], E1000State),
964 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[GPTC], E1000State),
965 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[ICR], E1000State),
966 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[ICS], E1000State),
967 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[IMC], E1000State),
968 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[IMS], E1000State),
969 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[LEDCTL], E1000State),
970 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[MANC], E1000State),
971 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[MDIC], E1000State),
972 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[MPC], E1000State),
973 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[PBA], E1000State),
974 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[RCTL], E1000State),
975 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[RDBAH], E1000State),
976 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[RDBAL], E1000State),
977 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[RDH], E1000State),
978 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[RDLEN], E1000State),
979 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[RDT], E1000State),
980 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[STATUS], E1000State),
981 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[SWSM], E1000State),
982 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TCTL], E1000State),
983 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TDBAH], E1000State),
984 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TDBAL], E1000State),
985 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TDH], E1000State),
986 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TDLEN], E1000State),
987 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TDT], E1000State),
988 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TORH], E1000State),
989 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TORL], E1000State),
990 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TOTH], E1000State),
991 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TOTL], E1000State),
992 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TPR], E1000State),
993 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TPT], E1000State),
994 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[TXDCTL], E1000State),
995 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[WUFC], E1000State),
996 e482dc3e Juan Quintela
        VMSTATE_UINT32(mac_reg[VET], E1000State),
997 e482dc3e Juan Quintela
        VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, RA, 32),
998 e482dc3e Juan Quintela
        VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, 128),
999 e482dc3e Juan Quintela
        VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA, 128),
1000 e482dc3e Juan Quintela
        VMSTATE_END_OF_LIST()
1001 e482dc3e Juan Quintela
    }
1002 e482dc3e Juan Quintela
};
1003 7c23b892 balrog
1004 88b4e9db blueswir1
static const uint16_t e1000_eeprom_template[64] = {
1005 7c23b892 balrog
    0x0000, 0x0000, 0x0000, 0x0000,      0xffff, 0x0000,      0x0000, 0x0000,
1006 7c23b892 balrog
    0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
1007 7c23b892 balrog
    0x0008, 0x2000, 0x7e14, 0x0048,      0x1000, 0x00d8,      0x0000, 0x2700,
1008 7c23b892 balrog
    0x6cc9, 0x3150, 0x0722, 0x040b,      0x0984, 0x0000,      0xc000, 0x0706,
1009 7c23b892 balrog
    0x1008, 0x0000, 0x0f04, 0x7fff,      0x4d01, 0xffff,      0xffff, 0xffff,
1010 7c23b892 balrog
    0xffff, 0xffff, 0xffff, 0xffff,      0xffff, 0xffff,      0xffff, 0xffff,
1011 7c23b892 balrog
    0x0100, 0x4000, 0x121c, 0xffff,      0xffff, 0xffff,      0xffff, 0xffff,
1012 7c23b892 balrog
    0xffff, 0xffff, 0xffff, 0xffff,      0xffff, 0xffff,      0xffff, 0x0000,
1013 7c23b892 balrog
};
1014 7c23b892 balrog
1015 88b4e9db blueswir1
static const uint16_t phy_reg_init[] = {
1016 7c23b892 balrog
    [PHY_CTRL] = 0x1140,                        [PHY_STATUS] = 0x796d, // link initially up
1017 7c23b892 balrog
    [PHY_ID1] = 0x141,                                [PHY_ID2] = PHY_ID2_INIT,
1018 7c23b892 balrog
    [PHY_1000T_CTRL] = 0x0e00,                        [M88E1000_PHY_SPEC_CTRL] = 0x360,
1019 7c23b892 balrog
    [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60,        [PHY_AUTONEG_ADV] = 0xde1,
1020 7c23b892 balrog
    [PHY_LP_ABILITY] = 0x1e0,                        [PHY_1000T_STATUS] = 0x3c00,
1021 700f6e2c aurel32
    [M88E1000_PHY_SPEC_STATUS] = 0xac00,
1022 7c23b892 balrog
};
1023 7c23b892 balrog
1024 88b4e9db blueswir1
static const uint32_t mac_reg_init[] = {
1025 7c23b892 balrog
    [PBA] =     0x00100030,
1026 7c23b892 balrog
    [LEDCTL] =  0x602,
1027 7c23b892 balrog
    [CTRL] =    E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
1028 7c23b892 balrog
                E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
1029 7c23b892 balrog
    [STATUS] =  0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
1030 7c23b892 balrog
                E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
1031 7c23b892 balrog
                E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
1032 7c23b892 balrog
                E1000_STATUS_LU,
1033 7c23b892 balrog
    [MANC] =    E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
1034 7c23b892 balrog
                E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
1035 7c23b892 balrog
                E1000_MANC_RMCP_EN,
1036 7c23b892 balrog
};
1037 7c23b892 balrog
1038 7c23b892 balrog
/* PCI interface */
1039 7c23b892 balrog
1040 d60efc6b Blue Swirl
static CPUWriteMemoryFunc * const e1000_mmio_write[] = {
1041 7c23b892 balrog
    e1000_mmio_writeb,        e1000_mmio_writew,        e1000_mmio_writel
1042 7c23b892 balrog
};
1043 7c23b892 balrog
1044 d60efc6b Blue Swirl
static CPUReadMemoryFunc * const e1000_mmio_read[] = {
1045 7c23b892 balrog
    e1000_mmio_readb,        e1000_mmio_readw,        e1000_mmio_readl
1046 7c23b892 balrog
};
1047 7c23b892 balrog
1048 7c23b892 balrog
static void
1049 7c23b892 balrog
e1000_mmio_map(PCIDevice *pci_dev, int region_num,
1050 6e355d90 Isaku Yamahata
                pcibus_t addr, pcibus_t size, int type)
1051 7c23b892 balrog
{
1052 7d9e52bd Juan Quintela
    E1000State *d = DO_UPCAST(E1000State, dev, pci_dev);
1053 f65ed4c1 aliguori
    int i;
1054 f65ed4c1 aliguori
    const uint32_t excluded_regs[] = {
1055 f65ed4c1 aliguori
        E1000_MDIC, E1000_ICR, E1000_ICS, E1000_IMS,
1056 f65ed4c1 aliguori
        E1000_IMC, E1000_TCTL, E1000_TDT, PNPMMIO_SIZE
1057 f65ed4c1 aliguori
    };
1058 f65ed4c1 aliguori
1059 7c23b892 balrog
1060 89e8b13c Isaku Yamahata
    DBGOUT(MMIO, "e1000_mmio_map addr=0x%08"FMT_PCIBUS" 0x%08"FMT_PCIBUS"\n",
1061 89e8b13c Isaku Yamahata
           addr, size);
1062 7c23b892 balrog
1063 7c23b892 balrog
    cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index);
1064 f65ed4c1 aliguori
    qemu_register_coalesced_mmio(addr, excluded_regs[0]);
1065 f65ed4c1 aliguori
1066 f65ed4c1 aliguori
    for (i = 0; excluded_regs[i] != PNPMMIO_SIZE; i++)
1067 f65ed4c1 aliguori
        qemu_register_coalesced_mmio(addr + excluded_regs[i] + 4,
1068 f65ed4c1 aliguori
                                     excluded_regs[i + 1] -
1069 f65ed4c1 aliguori
                                     excluded_regs[i] - 4);
1070 7c23b892 balrog
}
1071 7c23b892 balrog
1072 b946a153 aliguori
static void
1073 a03e2aec Mark McLoughlin
e1000_cleanup(VLANClientState *nc)
1074 b946a153 aliguori
{
1075 a03e2aec Mark McLoughlin
    E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque;
1076 b946a153 aliguori
1077 a03e2aec Mark McLoughlin
    s->nic = NULL;
1078 b946a153 aliguori
}
1079 b946a153 aliguori
1080 4b09be85 aliguori
static int
1081 4b09be85 aliguori
pci_e1000_uninit(PCIDevice *dev)
1082 4b09be85 aliguori
{
1083 7d9e52bd Juan Quintela
    E1000State *d = DO_UPCAST(E1000State, dev, dev);
1084 4b09be85 aliguori
1085 4b09be85 aliguori
    cpu_unregister_io_memory(d->mmio_index);
1086 a03e2aec Mark McLoughlin
    qemu_del_vlan_client(&d->nic->nc);
1087 4b09be85 aliguori
    return 0;
1088 4b09be85 aliguori
}
1089 4b09be85 aliguori
1090 32c86e95 Blue Swirl
static void e1000_reset(void *opaque)
1091 32c86e95 Blue Swirl
{
1092 32c86e95 Blue Swirl
    E1000State *d = opaque;
1093 32c86e95 Blue Swirl
1094 32c86e95 Blue Swirl
    memset(d->phy_reg, 0, sizeof d->phy_reg);
1095 32c86e95 Blue Swirl
    memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
1096 32c86e95 Blue Swirl
    memset(d->mac_reg, 0, sizeof d->mac_reg);
1097 32c86e95 Blue Swirl
    memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
1098 32c86e95 Blue Swirl
    d->rxbuf_min_shift = 1;
1099 32c86e95 Blue Swirl
    memset(&d->tx, 0, sizeof d->tx);
1100 32c86e95 Blue Swirl
}
1101 32c86e95 Blue Swirl
1102 a03e2aec Mark McLoughlin
static NetClientInfo net_e1000_info = {
1103 a03e2aec Mark McLoughlin
    .type = NET_CLIENT_TYPE_NIC,
1104 a03e2aec Mark McLoughlin
    .size = sizeof(NICState),
1105 a03e2aec Mark McLoughlin
    .can_receive = e1000_can_receive,
1106 a03e2aec Mark McLoughlin
    .receive = e1000_receive,
1107 a03e2aec Mark McLoughlin
    .cleanup = e1000_cleanup,
1108 a03e2aec Mark McLoughlin
    .link_status_changed = e1000_set_link_status,
1109 a03e2aec Mark McLoughlin
};
1110 a03e2aec Mark McLoughlin
1111 81a322d4 Gerd Hoffmann
static int pci_e1000_init(PCIDevice *pci_dev)
1112 7c23b892 balrog
{
1113 7d9e52bd Juan Quintela
    E1000State *d = DO_UPCAST(E1000State, dev, pci_dev);
1114 7c23b892 balrog
    uint8_t *pci_conf;
1115 7c23b892 balrog
    uint16_t checksum = 0;
1116 7c23b892 balrog
    int i;
1117 fbdaa002 Gerd Hoffmann
    uint8_t *macaddr;
1118 aff427a1 Chris Wright
1119 7c23b892 balrog
    pci_conf = d->dev.config;
1120 7c23b892 balrog
1121 deb54399 aliguori
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1122 deb54399 aliguori
    pci_config_set_device_id(pci_conf, E1000_DEVID);
1123 a9cbacb0 Michael S. Tsirkin
    /* TODO: we have no capabilities, so why is this bit set? */
1124 a9cbacb0 Michael S. Tsirkin
    pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_CAP_LIST);
1125 a9cbacb0 Michael S. Tsirkin
    pci_conf[PCI_REVISION_ID] = 0x03;
1126 173a543b blueswir1
    pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
1127 a9cbacb0 Michael S. Tsirkin
    /* TODO: RST# value should be 0, PCI spec 6.2.4 */
1128 a9cbacb0 Michael S. Tsirkin
    pci_conf[PCI_CACHE_LINE_SIZE] = 0x10;
1129 7c23b892 balrog
1130 a9cbacb0 Michael S. Tsirkin
    /* TODO: RST# value should be 0 if programmable, PCI spec 6.2.4 */
1131 a9cbacb0 Michael S. Tsirkin
    pci_conf[PCI_INTERRUPT_PIN] = 1; // interrupt pin 0
1132 7c23b892 balrog
1133 1eed09cb Avi Kivity
    d->mmio_index = cpu_register_io_memory(e1000_mmio_read,
1134 7c23b892 balrog
            e1000_mmio_write, d);
1135 7c23b892 balrog
1136 28c2c264 Avi Kivity
    pci_register_bar((PCIDevice *)d, 0, PNPMMIO_SIZE,
1137 0392a017 Isaku Yamahata
                           PCI_BASE_ADDRESS_SPACE_MEMORY, e1000_mmio_map);
1138 7c23b892 balrog
1139 28c2c264 Avi Kivity
    pci_register_bar((PCIDevice *)d, 1, IOPORT_SIZE,
1140 0392a017 Isaku Yamahata
                           PCI_BASE_ADDRESS_SPACE_IO, ioport_map);
1141 7c23b892 balrog
1142 7c23b892 balrog
    memmove(d->eeprom_data, e1000_eeprom_template,
1143 7c23b892 balrog
        sizeof e1000_eeprom_template);
1144 fbdaa002 Gerd Hoffmann
    qemu_macaddr_default_if_unset(&d->conf.macaddr);
1145 fbdaa002 Gerd Hoffmann
    macaddr = d->conf.macaddr.a;
1146 7c23b892 balrog
    for (i = 0; i < 3; i++)
1147 9d07d757 Paul Brook
        d->eeprom_data[i] = (macaddr[2*i+1]<<8) | macaddr[2*i];
1148 7c23b892 balrog
    for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
1149 7c23b892 balrog
        checksum += d->eeprom_data[i];
1150 7c23b892 balrog
    checksum = (uint16_t) EEPROM_SUM - checksum;
1151 7c23b892 balrog
    d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
1152 7c23b892 balrog
1153 a03e2aec Mark McLoughlin
    d->nic = qemu_new_nic(&net_e1000_info, &d->conf,
1154 a03e2aec Mark McLoughlin
                          d->dev.qdev.info->name, d->dev.qdev.id, d);
1155 7c23b892 balrog
1156 a03e2aec Mark McLoughlin
    qemu_format_nic_info_str(&d->nic->nc, macaddr);
1157 81a322d4 Gerd Hoffmann
    return 0;
1158 9d07d757 Paul Brook
}
1159 72da4208 aliguori
1160 fbdaa002 Gerd Hoffmann
static void qdev_e1000_reset(DeviceState *dev)
1161 fbdaa002 Gerd Hoffmann
{
1162 fbdaa002 Gerd Hoffmann
    E1000State *d = DO_UPCAST(E1000State, dev.qdev, dev);
1163 fbdaa002 Gerd Hoffmann
    e1000_reset(d);
1164 fbdaa002 Gerd Hoffmann
}
1165 fbdaa002 Gerd Hoffmann
1166 0aab0d3a Gerd Hoffmann
static PCIDeviceInfo e1000_info = {
1167 fbdaa002 Gerd Hoffmann
    .qdev.name  = "e1000",
1168 fbdaa002 Gerd Hoffmann
    .qdev.desc  = "Intel Gigabit Ethernet",
1169 fbdaa002 Gerd Hoffmann
    .qdev.size  = sizeof(E1000State),
1170 fbdaa002 Gerd Hoffmann
    .qdev.reset = qdev_e1000_reset,
1171 be73cfe2 Juan Quintela
    .qdev.vmsd  = &vmstate_e1000,
1172 fbdaa002 Gerd Hoffmann
    .init       = pci_e1000_init,
1173 fbdaa002 Gerd Hoffmann
    .exit       = pci_e1000_uninit,
1174 8c52c8f3 Gerd Hoffmann
    .romfile    = "pxe-e1000.bin",
1175 fbdaa002 Gerd Hoffmann
    .qdev.props = (Property[]) {
1176 fbdaa002 Gerd Hoffmann
        DEFINE_NIC_PROPERTIES(E1000State, conf),
1177 fbdaa002 Gerd Hoffmann
        DEFINE_PROP_END_OF_LIST(),
1178 fbdaa002 Gerd Hoffmann
    }
1179 0aab0d3a Gerd Hoffmann
};
1180 0aab0d3a Gerd Hoffmann
1181 9d07d757 Paul Brook
static void e1000_register_devices(void)
1182 9d07d757 Paul Brook
{
1183 0aab0d3a Gerd Hoffmann
    pci_qdev_register(&e1000_info);
1184 7c23b892 balrog
}
1185 9d07d757 Paul Brook
1186 9d07d757 Paul Brook
device_init(e1000_register_devices)