Statistics
| Branch: | Revision:

root / hw / e1000.c @ 40f16dd1

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