Statistics
| Branch: | Revision:

root / hw / e1000.c @ 8e00128d

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