Statistics
| Branch: | Revision:

root / hw / net / xilinx_axienet.c @ f0e7a81c

History | View | Annotate | Download (22.9 kB)

1
/*
2
 * QEMU model of Xilinx AXI-Ethernet.
3
 *
4
 * Copyright (c) 2011 Edgar E. Iglesias.
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24

    
25
#include "hw/sysbus.h"
26
#include "qemu/log.h"
27
#include "net/net.h"
28
#include "net/checksum.h"
29
#include "qapi/qmp/qerror.h"
30

    
31
#include "hw/stream.h"
32

    
33
#define DPHY(x)
34

    
35
#define TYPE_XILINX_AXI_ENET "xlnx.axi-ethernet"
36

    
37
#define XILINX_AXI_ENET(obj) \
38
     OBJECT_CHECK(XilinxAXIEnet, (obj), TYPE_XILINX_AXI_ENET)
39

    
40
/* Advertisement control register. */
41
#define ADVERTISE_10HALF        0x0020  /* Try for 10mbps half-duplex  */
42
#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
43
#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
44
#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
45

    
46
struct PHY {
47
    uint32_t regs[32];
48

    
49
    int link;
50

    
51
    unsigned int (*read)(struct PHY *phy, unsigned int req);
52
    void (*write)(struct PHY *phy, unsigned int req,
53
                  unsigned int data);
54
};
55

    
56
static unsigned int tdk_read(struct PHY *phy, unsigned int req)
57
{
58
    int regnum;
59
    unsigned r = 0;
60

    
61
    regnum = req & 0x1f;
62

    
63
    switch (regnum) {
64
        case 1:
65
            if (!phy->link) {
66
                break;
67
            }
68
            /* MR1.  */
69
            /* Speeds and modes.  */
70
            r |= (1 << 13) | (1 << 14);
71
            r |= (1 << 11) | (1 << 12);
72
            r |= (1 << 5); /* Autoneg complete.  */
73
            r |= (1 << 3); /* Autoneg able.  */
74
            r |= (1 << 2); /* link.  */
75
            r |= (1 << 1); /* link.  */
76
            break;
77
        case 5:
78
            /* Link partner ability.
79
               We are kind; always agree with whatever best mode
80
               the guest advertises.  */
81
            r = 1 << 14; /* Success.  */
82
            /* Copy advertised modes.  */
83
            r |= phy->regs[4] & (15 << 5);
84
            /* Autoneg support.  */
85
            r |= 1;
86
            break;
87
        case 17:
88
            /* Marvel PHY on many xilinx boards.  */
89
            r = 0x8000; /* 1000Mb  */
90
            break;
91
        case 18:
92
            {
93
                /* Diagnostics reg.  */
94
                int duplex = 0;
95
                int speed_100 = 0;
96

    
97
                if (!phy->link) {
98
                    break;
99
                }
100

    
101
                /* Are we advertising 100 half or 100 duplex ? */
102
                speed_100 = !!(phy->regs[4] & ADVERTISE_100HALF);
103
                speed_100 |= !!(phy->regs[4] & ADVERTISE_100FULL);
104

    
105
                /* Are we advertising 10 duplex or 100 duplex ? */
106
                duplex = !!(phy->regs[4] & ADVERTISE_100FULL);
107
                duplex |= !!(phy->regs[4] & ADVERTISE_10FULL);
108
                r = (speed_100 << 10) | (duplex << 11);
109
            }
110
            break;
111

    
112
        default:
113
            r = phy->regs[regnum];
114
            break;
115
    }
116
    DPHY(qemu_log("\n%s %x = reg[%d]\n", __func__, r, regnum));
117
    return r;
118
}
119

    
120
static void
121
tdk_write(struct PHY *phy, unsigned int req, unsigned int data)
122
{
123
    int regnum;
124

    
125
    regnum = req & 0x1f;
126
    DPHY(qemu_log("%s reg[%d] = %x\n", __func__, regnum, data));
127
    switch (regnum) {
128
        default:
129
            phy->regs[regnum] = data;
130
            break;
131
    }
132
}
133

    
134
static void
135
tdk_init(struct PHY *phy)
136
{
137
    phy->regs[0] = 0x3100;
138
    /* PHY Id.  */
139
    phy->regs[2] = 0x0300;
140
    phy->regs[3] = 0xe400;
141
    /* Autonegotiation advertisement reg.  */
142
    phy->regs[4] = 0x01E1;
143
    phy->link = 1;
144

    
145
    phy->read = tdk_read;
146
    phy->write = tdk_write;
147
}
148

    
149
struct MDIOBus {
150
    /* bus.  */
151
    int mdc;
152
    int mdio;
153

    
154
    /* decoder.  */
155
    enum {
156
        PREAMBLE,
157
        SOF,
158
        OPC,
159
        ADDR,
160
        REQ,
161
        TURNAROUND,
162
        DATA
163
    } state;
164
    unsigned int drive;
165

    
166
    unsigned int cnt;
167
    unsigned int addr;
168
    unsigned int opc;
169
    unsigned int req;
170
    unsigned int data;
171

    
172
    struct PHY *devs[32];
173
};
174

    
175
static void
176
mdio_attach(struct MDIOBus *bus, struct PHY *phy, unsigned int addr)
177
{
178
    bus->devs[addr & 0x1f] = phy;
179
}
180

    
181
#ifdef USE_THIS_DEAD_CODE
182
static void
183
mdio_detach(struct MDIOBus *bus, struct PHY *phy, unsigned int addr)
184
{
185
    bus->devs[addr & 0x1f] = NULL;
186
}
187
#endif
188

    
189
static uint16_t mdio_read_req(struct MDIOBus *bus, unsigned int addr,
190
                  unsigned int reg)
191
{
192
    struct PHY *phy;
193
    uint16_t data;
194

    
195
    phy = bus->devs[addr];
196
    if (phy && phy->read) {
197
        data = phy->read(phy, reg);
198
    } else {
199
        data = 0xffff;
200
    }
201
    DPHY(qemu_log("%s addr=%d reg=%d data=%x\n", __func__, addr, reg, data));
202
    return data;
203
}
204

    
205
static void mdio_write_req(struct MDIOBus *bus, unsigned int addr,
206
               unsigned int reg, uint16_t data)
207
{
208
    struct PHY *phy;
209

    
210
    DPHY(qemu_log("%s addr=%d reg=%d data=%x\n", __func__, addr, reg, data));
211
    phy = bus->devs[addr];
212
    if (phy && phy->write) {
213
        phy->write(phy, reg, data);
214
    }
215
}
216

    
217
#define DENET(x)
218

    
219
#define R_RAF      (0x000 / 4)
220
enum {
221
    RAF_MCAST_REJ = (1 << 1),
222
    RAF_BCAST_REJ = (1 << 2),
223
    RAF_EMCF_EN = (1 << 12),
224
    RAF_NEWFUNC_EN = (1 << 11)
225
};
226

    
227
#define R_IS       (0x00C / 4)
228
enum {
229
    IS_HARD_ACCESS_COMPLETE = 1,
230
    IS_AUTONEG = (1 << 1),
231
    IS_RX_COMPLETE = (1 << 2),
232
    IS_RX_REJECT = (1 << 3),
233
    IS_TX_COMPLETE = (1 << 5),
234
    IS_RX_DCM_LOCK = (1 << 6),
235
    IS_MGM_RDY = (1 << 7),
236
    IS_PHY_RST_DONE = (1 << 8),
237
};
238

    
239
#define R_IP       (0x010 / 4)
240
#define R_IE       (0x014 / 4)
241
#define R_UAWL     (0x020 / 4)
242
#define R_UAWU     (0x024 / 4)
243
#define R_PPST     (0x030 / 4)
244
enum {
245
    PPST_LINKSTATUS = (1 << 0),
246
    PPST_PHY_LINKSTATUS = (1 << 7),
247
};
248

    
249
#define R_STATS_RX_BYTESL (0x200 / 4)
250
#define R_STATS_RX_BYTESH (0x204 / 4)
251
#define R_STATS_TX_BYTESL (0x208 / 4)
252
#define R_STATS_TX_BYTESH (0x20C / 4)
253
#define R_STATS_RXL       (0x290 / 4)
254
#define R_STATS_RXH       (0x294 / 4)
255
#define R_STATS_RX_BCASTL (0x2a0 / 4)
256
#define R_STATS_RX_BCASTH (0x2a4 / 4)
257
#define R_STATS_RX_MCASTL (0x2a8 / 4)
258
#define R_STATS_RX_MCASTH (0x2ac / 4)
259

    
260
#define R_RCW0     (0x400 / 4)
261
#define R_RCW1     (0x404 / 4)
262
enum {
263
    RCW1_VLAN = (1 << 27),
264
    RCW1_RX   = (1 << 28),
265
    RCW1_FCS  = (1 << 29),
266
    RCW1_JUM  = (1 << 30),
267
    RCW1_RST  = (1 << 31),
268
};
269

    
270
#define R_TC       (0x408 / 4)
271
enum {
272
    TC_VLAN = (1 << 27),
273
    TC_TX   = (1 << 28),
274
    TC_FCS  = (1 << 29),
275
    TC_JUM  = (1 << 30),
276
    TC_RST  = (1 << 31),
277
};
278

    
279
#define R_EMMC     (0x410 / 4)
280
enum {
281
    EMMC_LINKSPEED_10MB = (0 << 30),
282
    EMMC_LINKSPEED_100MB = (1 << 30),
283
    EMMC_LINKSPEED_1000MB = (2 << 30),
284
};
285

    
286
#define R_PHYC     (0x414 / 4)
287

    
288
#define R_MC       (0x500 / 4)
289
#define MC_EN      (1 << 6)
290

    
291
#define R_MCR      (0x504 / 4)
292
#define R_MWD      (0x508 / 4)
293
#define R_MRD      (0x50c / 4)
294
#define R_MIS      (0x600 / 4)
295
#define R_MIP      (0x620 / 4)
296
#define R_MIE      (0x640 / 4)
297
#define R_MIC      (0x640 / 4)
298

    
299
#define R_UAW0     (0x700 / 4)
300
#define R_UAW1     (0x704 / 4)
301
#define R_FMI      (0x708 / 4)
302
#define R_AF0      (0x710 / 4)
303
#define R_AF1      (0x714 / 4)
304
#define R_MAX      (0x34 / 4)
305

    
306
/* Indirect registers.  */
307
struct TEMAC  {
308
    struct MDIOBus mdio_bus;
309
    struct PHY phy;
310

    
311
    void *parent;
312
};
313

    
314
typedef struct XilinxAXIEnet XilinxAXIEnet;
315

    
316
struct XilinxAXIEnet {
317
    SysBusDevice busdev;
318
    MemoryRegion iomem;
319
    qemu_irq irq;
320
    StreamSlave *tx_dev;
321
    NICState *nic;
322
    NICConf conf;
323

    
324

    
325
    uint32_t c_rxmem;
326
    uint32_t c_txmem;
327
    uint32_t c_phyaddr;
328

    
329
    struct TEMAC TEMAC;
330

    
331
    /* MII regs.  */
332
    union {
333
        uint32_t regs[4];
334
        struct {
335
            uint32_t mc;
336
            uint32_t mcr;
337
            uint32_t mwd;
338
            uint32_t mrd;
339
        };
340
    } mii;
341

    
342
    struct {
343
        uint64_t rx_bytes;
344
        uint64_t tx_bytes;
345

    
346
        uint64_t rx;
347
        uint64_t rx_bcast;
348
        uint64_t rx_mcast;
349
    } stats;
350

    
351
    /* Receive configuration words.  */
352
    uint32_t rcw[2];
353
    /* Transmit config.  */
354
    uint32_t tc;
355
    uint32_t emmc;
356
    uint32_t phyc;
357

    
358
    /* Unicast Address Word.  */
359
    uint32_t uaw[2];
360
    /* Unicast address filter used with extended mcast.  */
361
    uint32_t ext_uaw[2];
362
    uint32_t fmi;
363

    
364
    uint32_t regs[R_MAX];
365

    
366
    /* Multicast filter addrs.  */
367
    uint32_t maddr[4][2];
368
    /* 32K x 1 lookup filter.  */
369
    uint32_t ext_mtable[1024];
370

    
371

    
372
    uint8_t *rxmem;
373
};
374

    
375
static void axienet_rx_reset(XilinxAXIEnet *s)
376
{
377
    s->rcw[1] = RCW1_JUM | RCW1_FCS | RCW1_RX | RCW1_VLAN;
378
}
379

    
380
static void axienet_tx_reset(XilinxAXIEnet *s)
381
{
382
    s->tc = TC_JUM | TC_TX | TC_VLAN;
383
}
384

    
385
static inline int axienet_rx_resetting(XilinxAXIEnet *s)
386
{
387
    return s->rcw[1] & RCW1_RST;
388
}
389

    
390
static inline int axienet_rx_enabled(XilinxAXIEnet *s)
391
{
392
    return s->rcw[1] & RCW1_RX;
393
}
394

    
395
static inline int axienet_extmcf_enabled(XilinxAXIEnet *s)
396
{
397
    return !!(s->regs[R_RAF] & RAF_EMCF_EN);
398
}
399

    
400
static inline int axienet_newfunc_enabled(XilinxAXIEnet *s)
401
{
402
    return !!(s->regs[R_RAF] & RAF_NEWFUNC_EN);
403
}
404

    
405
static void axienet_reset(XilinxAXIEnet *s)
406
{
407
    axienet_rx_reset(s);
408
    axienet_tx_reset(s);
409

    
410
    s->regs[R_PPST] = PPST_LINKSTATUS | PPST_PHY_LINKSTATUS;
411
    s->regs[R_IS] = IS_AUTONEG | IS_RX_DCM_LOCK | IS_MGM_RDY | IS_PHY_RST_DONE;
412

    
413
    s->emmc = EMMC_LINKSPEED_100MB;
414
}
415

    
416
static void enet_update_irq(XilinxAXIEnet *s)
417
{
418
    s->regs[R_IP] = s->regs[R_IS] & s->regs[R_IE];
419
    qemu_set_irq(s->irq, !!s->regs[R_IP]);
420
}
421

    
422
static uint64_t enet_read(void *opaque, hwaddr addr, unsigned size)
423
{
424
    XilinxAXIEnet *s = opaque;
425
    uint32_t r = 0;
426
    addr >>= 2;
427

    
428
    switch (addr) {
429
        case R_RCW0:
430
        case R_RCW1:
431
            r = s->rcw[addr & 1];
432
            break;
433

    
434
        case R_TC:
435
            r = s->tc;
436
            break;
437

    
438
        case R_EMMC:
439
            r = s->emmc;
440
            break;
441

    
442
        case R_PHYC:
443
            r = s->phyc;
444
            break;
445

    
446
        case R_MCR:
447
            r = s->mii.regs[addr & 3] | (1 << 7); /* Always ready.  */
448
            break;
449

    
450
        case R_STATS_RX_BYTESL:
451
        case R_STATS_RX_BYTESH:
452
            r = s->stats.rx_bytes >> (32 * (addr & 1));
453
            break;
454

    
455
        case R_STATS_TX_BYTESL:
456
        case R_STATS_TX_BYTESH:
457
            r = s->stats.tx_bytes >> (32 * (addr & 1));
458
            break;
459

    
460
        case R_STATS_RXL:
461
        case R_STATS_RXH:
462
            r = s->stats.rx >> (32 * (addr & 1));
463
            break;
464
        case R_STATS_RX_BCASTL:
465
        case R_STATS_RX_BCASTH:
466
            r = s->stats.rx_bcast >> (32 * (addr & 1));
467
            break;
468
        case R_STATS_RX_MCASTL:
469
        case R_STATS_RX_MCASTH:
470
            r = s->stats.rx_mcast >> (32 * (addr & 1));
471
            break;
472

    
473
        case R_MC:
474
        case R_MWD:
475
        case R_MRD:
476
            r = s->mii.regs[addr & 3];
477
            break;
478

    
479
        case R_UAW0:
480
        case R_UAW1:
481
            r = s->uaw[addr & 1];
482
            break;
483

    
484
        case R_UAWU:
485
        case R_UAWL:
486
            r = s->ext_uaw[addr & 1];
487
            break;
488

    
489
        case R_FMI:
490
            r = s->fmi;
491
            break;
492

    
493
        case R_AF0:
494
        case R_AF1:
495
            r = s->maddr[s->fmi & 3][addr & 1];
496
            break;
497

    
498
        case 0x8000 ... 0x83ff:
499
            r = s->ext_mtable[addr - 0x8000];
500
            break;
501

    
502
        default:
503
            if (addr < ARRAY_SIZE(s->regs)) {
504
                r = s->regs[addr];
505
            }
506
            DENET(qemu_log("%s addr=" TARGET_FMT_plx " v=%x\n",
507
                            __func__, addr * 4, r));
508
            break;
509
    }
510
    return r;
511
}
512

    
513
static void enet_write(void *opaque, hwaddr addr,
514
                       uint64_t value, unsigned size)
515
{
516
    XilinxAXIEnet *s = opaque;
517
    struct TEMAC *t = &s->TEMAC;
518

    
519
    addr >>= 2;
520
    switch (addr) {
521
        case R_RCW0:
522
        case R_RCW1:
523
            s->rcw[addr & 1] = value;
524
            if ((addr & 1) && value & RCW1_RST) {
525
                axienet_rx_reset(s);
526
            } else {
527
                qemu_flush_queued_packets(qemu_get_queue(s->nic));
528
            }
529
            break;
530

    
531
        case R_TC:
532
            s->tc = value;
533
            if (value & TC_RST) {
534
                axienet_tx_reset(s);
535
            }
536
            break;
537

    
538
        case R_EMMC:
539
            s->emmc = value;
540
            break;
541

    
542
        case R_PHYC:
543
            s->phyc = value;
544
            break;
545

    
546
        case R_MC:
547
             value &= ((1 < 7) - 1);
548

    
549
             /* Enable the MII.  */
550
             if (value & MC_EN) {
551
                 unsigned int miiclkdiv = value & ((1 << 6) - 1);
552
                 if (!miiclkdiv) {
553
                     qemu_log("AXIENET: MDIO enabled but MDIOCLK is zero!\n");
554
                 }
555
             }
556
             s->mii.mc = value;
557
             break;
558

    
559
        case R_MCR: {
560
             unsigned int phyaddr = (value >> 24) & 0x1f;
561
             unsigned int regaddr = (value >> 16) & 0x1f;
562
             unsigned int op = (value >> 14) & 3;
563
             unsigned int initiate = (value >> 11) & 1;
564

    
565
             if (initiate) {
566
                 if (op == 1) {
567
                     mdio_write_req(&t->mdio_bus, phyaddr, regaddr, s->mii.mwd);
568
                 } else if (op == 2) {
569
                     s->mii.mrd = mdio_read_req(&t->mdio_bus, phyaddr, regaddr);
570
                 } else {
571
                     qemu_log("AXIENET: invalid MDIOBus OP=%d\n", op);
572
                 }
573
             }
574
             s->mii.mcr = value;
575
             break;
576
        }
577

    
578
        case R_MWD:
579
        case R_MRD:
580
             s->mii.regs[addr & 3] = value;
581
             break;
582

    
583

    
584
        case R_UAW0:
585
        case R_UAW1:
586
            s->uaw[addr & 1] = value;
587
            break;
588

    
589
        case R_UAWL:
590
        case R_UAWU:
591
            s->ext_uaw[addr & 1] = value;
592
            break;
593

    
594
        case R_FMI:
595
            s->fmi = value;
596
            break;
597

    
598
        case R_AF0:
599
        case R_AF1:
600
            s->maddr[s->fmi & 3][addr & 1] = value;
601
            break;
602

    
603
        case R_IS:
604
            s->regs[addr] &= ~value;
605
            break;
606

    
607
        case 0x8000 ... 0x83ff:
608
            s->ext_mtable[addr - 0x8000] = value;
609
            break;
610

    
611
        default:
612
            DENET(qemu_log("%s addr=" TARGET_FMT_plx " v=%x\n",
613
                           __func__, addr * 4, (unsigned)value));
614
            if (addr < ARRAY_SIZE(s->regs)) {
615
                s->regs[addr] = value;
616
            }
617
            break;
618
    }
619
    enet_update_irq(s);
620
}
621

    
622
static const MemoryRegionOps enet_ops = {
623
    .read = enet_read,
624
    .write = enet_write,
625
    .endianness = DEVICE_LITTLE_ENDIAN,
626
};
627

    
628
static int eth_can_rx(NetClientState *nc)
629
{
630
    XilinxAXIEnet *s = qemu_get_nic_opaque(nc);
631

    
632
    /* RX enabled?  */
633
    return !axienet_rx_resetting(s) && axienet_rx_enabled(s);
634
}
635

    
636
static int enet_match_addr(const uint8_t *buf, uint32_t f0, uint32_t f1)
637
{
638
    int match = 1;
639

    
640
    if (memcmp(buf, &f0, 4)) {
641
        match = 0;
642
    }
643

    
644
    if (buf[4] != (f1 & 0xff) || buf[5] != ((f1 >> 8) & 0xff)) {
645
        match = 0;
646
    }
647

    
648
    return match;
649
}
650

    
651
static ssize_t eth_rx(NetClientState *nc, const uint8_t *buf, size_t size)
652
{
653
    XilinxAXIEnet *s = qemu_get_nic_opaque(nc);
654
    static const unsigned char sa_bcast[6] = {0xff, 0xff, 0xff,
655
                                              0xff, 0xff, 0xff};
656
    static const unsigned char sa_ipmcast[3] = {0x01, 0x00, 0x52};
657
    uint32_t app[6] = {0};
658
    int promisc = s->fmi & (1 << 31);
659
    int unicast, broadcast, multicast, ip_multicast = 0;
660
    uint32_t csum32;
661
    uint16_t csum16;
662
    int i;
663

    
664
    DENET(qemu_log("%s: %zd bytes\n", __func__, size));
665

    
666
    unicast = ~buf[0] & 0x1;
667
    broadcast = memcmp(buf, sa_bcast, 6) == 0;
668
    multicast = !unicast && !broadcast;
669
    if (multicast && (memcmp(sa_ipmcast, buf, sizeof sa_ipmcast) == 0)) {
670
        ip_multicast = 1;
671
    }
672

    
673
    /* Jumbo or vlan sizes ?  */
674
    if (!(s->rcw[1] & RCW1_JUM)) {
675
        if (size > 1518 && size <= 1522 && !(s->rcw[1] & RCW1_VLAN)) {
676
            return size;
677
        }
678
    }
679

    
680
    /* Basic Address filters.  If you want to use the extended filters
681
       you'll generally have to place the ethernet mac into promiscuous mode
682
       to avoid the basic filtering from dropping most frames.  */
683
    if (!promisc) {
684
        if (unicast) {
685
            if (!enet_match_addr(buf, s->uaw[0], s->uaw[1])) {
686
                return size;
687
            }
688
        } else {
689
            if (broadcast) {
690
                /* Broadcast.  */
691
                if (s->regs[R_RAF] & RAF_BCAST_REJ) {
692
                    return size;
693
                }
694
            } else {
695
                int drop = 1;
696

    
697
                /* Multicast.  */
698
                if (s->regs[R_RAF] & RAF_MCAST_REJ) {
699
                    return size;
700
                }
701

    
702
                for (i = 0; i < 4; i++) {
703
                    if (enet_match_addr(buf, s->maddr[i][0], s->maddr[i][1])) {
704
                        drop = 0;
705
                        break;
706
                    }
707
                }
708

    
709
                if (drop) {
710
                    return size;
711
                }
712
            }
713
        }
714
    }
715

    
716
    /* Extended mcast filtering enabled?  */
717
    if (axienet_newfunc_enabled(s) && axienet_extmcf_enabled(s)) {
718
        if (unicast) {
719
            if (!enet_match_addr(buf, s->ext_uaw[0], s->ext_uaw[1])) {
720
                return size;
721
            }
722
        } else {
723
            if (broadcast) {
724
                /* Broadcast. ???  */
725
                if (s->regs[R_RAF] & RAF_BCAST_REJ) {
726
                    return size;
727
                }
728
            } else {
729
                int idx, bit;
730

    
731
                /* Multicast.  */
732
                if (!memcmp(buf, sa_ipmcast, 3)) {
733
                    return size;
734
                }
735

    
736
                idx  = (buf[4] & 0x7f) << 8;
737
                idx |= buf[5];
738

    
739
                bit = 1 << (idx & 0x1f);
740
                idx >>= 5;
741

    
742
                if (!(s->ext_mtable[idx] & bit)) {
743
                    return size;
744
                }
745
            }
746
        }
747
    }
748

    
749
    if (size < 12) {
750
        s->regs[R_IS] |= IS_RX_REJECT;
751
        enet_update_irq(s);
752
        return -1;
753
    }
754

    
755
    if (size > (s->c_rxmem - 4)) {
756
        size = s->c_rxmem - 4;
757
    }
758

    
759
    memcpy(s->rxmem, buf, size);
760
    memset(s->rxmem + size, 0, 4); /* Clear the FCS.  */
761

    
762
    if (s->rcw[1] & RCW1_FCS) {
763
        size += 4; /* fcs is inband.  */
764
    }
765

    
766
    app[0] = 5 << 28;
767
    csum32 = net_checksum_add(size - 14, (uint8_t *)s->rxmem + 14);
768
    /* Fold it once.  */
769
    csum32 = (csum32 & 0xffff) + (csum32 >> 16);
770
    /* And twice to get rid of possible carries.  */
771
    csum16 = (csum32 & 0xffff) + (csum32 >> 16);
772
    app[3] = csum16;
773
    app[4] = size & 0xffff;
774

    
775
    s->stats.rx_bytes += size;
776
    s->stats.rx++;
777
    if (multicast) {
778
        s->stats.rx_mcast++;
779
        app[2] |= 1 | (ip_multicast << 1);
780
    } else if (broadcast) {
781
        s->stats.rx_bcast++;
782
        app[2] |= 1 << 3;
783
    }
784

    
785
    /* Good frame.  */
786
    app[2] |= 1 << 6;
787

    
788
    stream_push(s->tx_dev, (void *)s->rxmem, size, app);
789

    
790
    s->regs[R_IS] |= IS_RX_COMPLETE;
791
    enet_update_irq(s);
792
    return size;
793
}
794

    
795
static void eth_cleanup(NetClientState *nc)
796
{
797
    /* FIXME.  */
798
    XilinxAXIEnet *s = qemu_get_nic_opaque(nc);
799
    g_free(s->rxmem);
800
    g_free(s);
801
}
802

    
803
static void
804
axienet_stream_push(StreamSlave *obj, uint8_t *buf, size_t size, uint32_t *hdr)
805
{
806
    XilinxAXIEnet *s = FROM_SYSBUS(typeof(*s), SYS_BUS_DEVICE(obj));
807

    
808
    /* TX enable ?  */
809
    if (!(s->tc & TC_TX)) {
810
        return;
811
    }
812

    
813
    /* Jumbo or vlan sizes ?  */
814
    if (!(s->tc & TC_JUM)) {
815
        if (size > 1518 && size <= 1522 && !(s->tc & TC_VLAN)) {
816
            return;
817
        }
818
    }
819

    
820
    if (hdr[0] & 1) {
821
        unsigned int start_off = hdr[1] >> 16;
822
        unsigned int write_off = hdr[1] & 0xffff;
823
        uint32_t tmp_csum;
824
        uint16_t csum;
825

    
826
        tmp_csum = net_checksum_add(size - start_off,
827
                                    (uint8_t *)buf + start_off);
828
        /* Accumulate the seed.  */
829
        tmp_csum += hdr[2] & 0xffff;
830

    
831
        /* Fold the 32bit partial checksum.  */
832
        csum = net_checksum_finish(tmp_csum);
833

    
834
        /* Writeback.  */
835
        buf[write_off] = csum >> 8;
836
        buf[write_off + 1] = csum & 0xff;
837
    }
838

    
839
    qemu_send_packet(qemu_get_queue(s->nic), buf, size);
840

    
841
    s->stats.tx_bytes += size;
842
    s->regs[R_IS] |= IS_TX_COMPLETE;
843
    enet_update_irq(s);
844
}
845

    
846
static NetClientInfo net_xilinx_enet_info = {
847
    .type = NET_CLIENT_OPTIONS_KIND_NIC,
848
    .size = sizeof(NICState),
849
    .can_receive = eth_can_rx,
850
    .receive = eth_rx,
851
    .cleanup = eth_cleanup,
852
};
853

    
854
static int xilinx_enet_init(SysBusDevice *dev)
855
{
856
    XilinxAXIEnet *s = XILINX_AXI_ENET(dev);
857

    
858
    sysbus_init_irq(dev, &s->irq);
859

    
860
    memory_region_init_io(&s->iomem, &enet_ops, s, "enet", 0x40000);
861
    sysbus_init_mmio(dev, &s->iomem);
862

    
863
    qemu_macaddr_default_if_unset(&s->conf.macaddr);
864
    s->nic = qemu_new_nic(&net_xilinx_enet_info, &s->conf,
865
                          object_get_typename(OBJECT(dev)), dev->qdev.id, s);
866
    qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
867

    
868
    tdk_init(&s->TEMAC.phy);
869
    mdio_attach(&s->TEMAC.mdio_bus, &s->TEMAC.phy, s->c_phyaddr);
870

    
871
    s->TEMAC.parent = s;
872

    
873
    s->rxmem = g_malloc(s->c_rxmem);
874
    axienet_reset(s);
875

    
876
    return 0;
877
}
878

    
879
static void xilinx_enet_initfn(Object *obj)
880
{
881
    XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
882
    Error *errp = NULL;
883

    
884
    object_property_add_link(obj, "axistream-connected", TYPE_STREAM_SLAVE,
885
                             (Object **) &s->tx_dev, &errp);
886
    assert_no_error(errp);
887
}
888

    
889
static Property xilinx_enet_properties[] = {
890
    DEFINE_PROP_UINT32("phyaddr", XilinxAXIEnet, c_phyaddr, 7),
891
    DEFINE_PROP_UINT32("rxmem", XilinxAXIEnet, c_rxmem, 0x1000),
892
    DEFINE_PROP_UINT32("txmem", XilinxAXIEnet, c_txmem, 0x1000),
893
    DEFINE_NIC_PROPERTIES(XilinxAXIEnet, conf),
894
    DEFINE_PROP_END_OF_LIST(),
895
};
896

    
897
static void xilinx_enet_class_init(ObjectClass *klass, void *data)
898
{
899
    DeviceClass *dc = DEVICE_CLASS(klass);
900
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
901
    StreamSlaveClass *ssc = STREAM_SLAVE_CLASS(klass);
902

    
903
    k->init = xilinx_enet_init;
904
    dc->props = xilinx_enet_properties;
905
    ssc->push = axienet_stream_push;
906
}
907

    
908
static const TypeInfo xilinx_enet_info = {
909
    .name          = TYPE_XILINX_AXI_ENET,
910
    .parent        = TYPE_SYS_BUS_DEVICE,
911
    .instance_size = sizeof(XilinxAXIEnet),
912
    .class_init    = xilinx_enet_class_init,
913
    .instance_init = xilinx_enet_initfn,
914
    .interfaces = (InterfaceInfo[]) {
915
            { TYPE_STREAM_SLAVE },
916
            { }
917
    }
918
};
919

    
920
static void xilinx_enet_register_types(void)
921
{
922
    type_register_static(&xilinx_enet_info);
923
}
924

    
925
type_init(xilinx_enet_register_types)