qemu/hw/net/tulip.c
<<
>>
Prefs
   1/*
   2 * QEMU TULIP Emulation
   3 *
   4 * Copyright (c) 2019 Sven Schnelle <svens@stackframe.org>
   5 *
   6 * This work is licensed under the GNU GPL license version 2 or later.
   7 */
   8
   9#include "qemu/osdep.h"
  10#include "qemu/log.h"
  11#include "hw/irq.h"
  12#include "hw/pci/pci.h"
  13#include "hw/qdev-properties.h"
  14#include "hw/nvram/eeprom93xx.h"
  15#include "migration/vmstate.h"
  16#include "sysemu/sysemu.h"
  17#include "tulip.h"
  18#include "trace.h"
  19#include "net/eth.h"
  20
  21typedef struct TULIPState {
  22    PCIDevice dev;
  23    MemoryRegion io;
  24    MemoryRegion memory;
  25    NICConf c;
  26    qemu_irq irq;
  27    NICState *nic;
  28    eeprom_t *eeprom;
  29    uint32_t csr[16];
  30
  31    /* state for MII */
  32    uint32_t old_csr9;
  33    uint32_t mii_word;
  34    uint32_t mii_bitcnt;
  35
  36    hwaddr current_rx_desc;
  37    hwaddr current_tx_desc;
  38
  39    uint8_t rx_frame[2048];
  40    uint8_t tx_frame[2048];
  41    uint16_t tx_frame_len;
  42    uint16_t rx_frame_len;
  43    uint16_t rx_frame_size;
  44
  45    uint32_t rx_status;
  46    uint8_t filter[16][6];
  47} TULIPState;
  48
  49static const VMStateDescription vmstate_pci_tulip = {
  50    .name = "tulip",
  51    .fields = (VMStateField[]) {
  52        VMSTATE_PCI_DEVICE(dev, TULIPState),
  53        VMSTATE_UINT32_ARRAY(csr, TULIPState, 16),
  54        VMSTATE_UINT32(old_csr9, TULIPState),
  55        VMSTATE_UINT32(mii_word, TULIPState),
  56        VMSTATE_UINT32(mii_bitcnt, TULIPState),
  57        VMSTATE_UINT64(current_rx_desc, TULIPState),
  58        VMSTATE_UINT64(current_tx_desc, TULIPState),
  59        VMSTATE_BUFFER(rx_frame, TULIPState),
  60        VMSTATE_BUFFER(tx_frame, TULIPState),
  61        VMSTATE_UINT16(rx_frame_len, TULIPState),
  62        VMSTATE_UINT16(tx_frame_len, TULIPState),
  63        VMSTATE_UINT16(rx_frame_size, TULIPState),
  64        VMSTATE_UINT32(rx_status, TULIPState),
  65        VMSTATE_UINT8_2DARRAY(filter, TULIPState, 16, 6),
  66        VMSTATE_END_OF_LIST()
  67    }
  68};
  69
  70static void tulip_desc_read(TULIPState *s, hwaddr p,
  71        struct tulip_descriptor *desc)
  72{
  73    if (s->csr[0] & CSR0_DBO) {
  74        desc->status = ldl_be_pci_dma(&s->dev, p);
  75        desc->control = ldl_be_pci_dma(&s->dev, p + 4);
  76        desc->buf_addr1 = ldl_be_pci_dma(&s->dev, p + 8);
  77        desc->buf_addr2 = ldl_be_pci_dma(&s->dev, p + 12);
  78    } else {
  79        desc->status = ldl_le_pci_dma(&s->dev, p);
  80        desc->control = ldl_le_pci_dma(&s->dev, p + 4);
  81        desc->buf_addr1 = ldl_le_pci_dma(&s->dev, p + 8);
  82        desc->buf_addr2 = ldl_le_pci_dma(&s->dev, p + 12);
  83    }
  84}
  85
  86static void tulip_desc_write(TULIPState *s, hwaddr p,
  87        struct tulip_descriptor *desc)
  88{
  89    if (s->csr[0] & CSR0_DBO) {
  90        stl_be_pci_dma(&s->dev, p, desc->status);
  91        stl_be_pci_dma(&s->dev, p + 4, desc->control);
  92        stl_be_pci_dma(&s->dev, p + 8, desc->buf_addr1);
  93        stl_be_pci_dma(&s->dev, p + 12, desc->buf_addr2);
  94    } else {
  95        stl_le_pci_dma(&s->dev, p, desc->status);
  96        stl_le_pci_dma(&s->dev, p + 4, desc->control);
  97        stl_le_pci_dma(&s->dev, p + 8, desc->buf_addr1);
  98        stl_le_pci_dma(&s->dev, p + 12, desc->buf_addr2);
  99    }
 100}
 101
 102static void tulip_update_int(TULIPState *s)
 103{
 104    uint32_t ie = s->csr[5] & s->csr[7];
 105    bool assert = false;
 106
 107    s->csr[5] &= ~(CSR5_AIS | CSR5_NIS);
 108
 109    if (ie & (CSR5_TI | CSR5_TU | CSR5_RI | CSR5_GTE | CSR5_ERI)) {
 110        s->csr[5] |= CSR5_NIS;
 111    }
 112
 113    if (ie & (CSR5_LC | CSR5_GPI | CSR5_FBE | CSR5_LNF | CSR5_ETI | CSR5_RWT |
 114              CSR5_RPS | CSR5_RU | CSR5_UNF | CSR5_LNP_ANC | CSR5_TJT |
 115              CSR5_TPS)) {
 116        s->csr[5] |= CSR5_AIS;
 117    }
 118
 119    assert = s->csr[5] & s->csr[7] & (CSR5_AIS | CSR5_NIS);
 120    trace_tulip_irq(s->csr[5], s->csr[7], assert ? "assert" : "deassert");
 121    qemu_set_irq(s->irq, assert);
 122}
 123
 124static bool tulip_rx_stopped(TULIPState *s)
 125{
 126    return ((s->csr[5] >> CSR5_RS_SHIFT) & CSR5_RS_MASK) == CSR5_RS_STOPPED;
 127}
 128
 129static void tulip_dump_tx_descriptor(TULIPState *s,
 130        struct tulip_descriptor *desc)
 131{
 132    trace_tulip_descriptor("TX ", s->current_tx_desc,
 133                desc->status, desc->control >> 22,
 134                desc->control & 0x7ff, (desc->control >> 11) & 0x7ff,
 135                desc->buf_addr1, desc->buf_addr2);
 136}
 137
 138static void tulip_dump_rx_descriptor(TULIPState *s,
 139        struct tulip_descriptor *desc)
 140{
 141    trace_tulip_descriptor("RX ", s->current_rx_desc,
 142                desc->status, desc->control >> 22,
 143                desc->control & 0x7ff, (desc->control >> 11) & 0x7ff,
 144                desc->buf_addr1, desc->buf_addr2);
 145}
 146
 147static void tulip_next_rx_descriptor(TULIPState *s,
 148    struct tulip_descriptor *desc)
 149{
 150    if (desc->control & RDES1_RER) {
 151        s->current_rx_desc = s->csr[3];
 152    } else if (desc->control & RDES1_RCH) {
 153        s->current_rx_desc = desc->buf_addr2;
 154    } else {
 155        s->current_rx_desc += sizeof(struct tulip_descriptor) +
 156                (((s->csr[0] >> CSR0_DSL_SHIFT) & CSR0_DSL_MASK) << 2);
 157    }
 158    s->current_rx_desc &= ~3ULL;
 159}
 160
 161static void tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
 162{
 163    int len1 = (desc->control >> RDES1_BUF1_SIZE_SHIFT) & RDES1_BUF1_SIZE_MASK;
 164    int len2 = (desc->control >> RDES1_BUF2_SIZE_SHIFT) & RDES1_BUF2_SIZE_MASK;
 165    int len;
 166
 167    if (s->rx_frame_len && len1) {
 168        if (s->rx_frame_len > len1) {
 169            len = len1;
 170        } else {
 171            len = s->rx_frame_len;
 172        }
 173        pci_dma_write(&s->dev, desc->buf_addr1, s->rx_frame +
 174            (s->rx_frame_size - s->rx_frame_len), len);
 175        s->rx_frame_len -= len;
 176    }
 177
 178    if (s->rx_frame_len && len2) {
 179        if (s->rx_frame_len > len2) {
 180            len = len2;
 181        } else {
 182            len = s->rx_frame_len;
 183        }
 184        pci_dma_write(&s->dev, desc->buf_addr2, s->rx_frame +
 185            (s->rx_frame_size - s->rx_frame_len), len);
 186        s->rx_frame_len -= len;
 187    }
 188}
 189
 190static bool tulip_filter_address(TULIPState *s, const uint8_t *addr)
 191{
 192    static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 193    bool ret = false;
 194    int i;
 195
 196    for (i = 0; i < 16 && ret == false; i++) {
 197        if (!memcmp(&s->filter[i], addr, ETH_ALEN)) {
 198            ret = true;
 199        }
 200    }
 201
 202    if (!memcmp(addr, broadcast, ETH_ALEN)) {
 203        return true;
 204    }
 205
 206    if (s->csr[6] & (CSR6_PR | CSR6_RA)) {
 207        /* Promiscuous mode enabled */
 208        s->rx_status |= RDES0_FF;
 209        return true;
 210    }
 211
 212    if ((s->csr[6] & CSR6_PM) && (addr[0] & 1)) {
 213        /* Pass all Multicast enabled */
 214        s->rx_status |= RDES0_MF;
 215        return true;
 216    }
 217
 218    if (s->csr[6] & CSR6_IF) {
 219        ret ^= true;
 220    }
 221    return ret;
 222}
 223
 224static ssize_t tulip_receive(TULIPState *s, const uint8_t *buf, size_t size)
 225{
 226    struct tulip_descriptor desc;
 227
 228    trace_tulip_receive(buf, size);
 229
 230    if (size < 14 || size > 2048 || s->rx_frame_len || tulip_rx_stopped(s)) {
 231        return 0;
 232    }
 233
 234    if (!tulip_filter_address(s, buf)) {
 235        return size;
 236    }
 237
 238    do {
 239        tulip_desc_read(s, s->current_rx_desc, &desc);
 240        tulip_dump_rx_descriptor(s, &desc);
 241
 242        if (!(desc.status & RDES0_OWN)) {
 243            s->csr[5] |= CSR5_RU;
 244            tulip_update_int(s);
 245            return s->rx_frame_size - s->rx_frame_len;
 246        }
 247        desc.status = 0;
 248
 249        if (!s->rx_frame_len) {
 250            s->rx_frame_size = size + 4;
 251            s->rx_status = RDES0_LS |
 252                 ((s->rx_frame_size & RDES0_FL_MASK) << RDES0_FL_SHIFT);
 253            desc.status |= RDES0_FS;
 254            memcpy(s->rx_frame, buf, size);
 255            s->rx_frame_len = s->rx_frame_size;
 256        }
 257
 258        tulip_copy_rx_bytes(s, &desc);
 259
 260        if (!s->rx_frame_len) {
 261            desc.status |= s->rx_status;
 262            s->csr[5] |= CSR5_RI;
 263            tulip_update_int(s);
 264        }
 265        tulip_dump_rx_descriptor(s, &desc);
 266        tulip_desc_write(s, s->current_rx_desc, &desc);
 267        tulip_next_rx_descriptor(s, &desc);
 268    } while (s->rx_frame_len);
 269    return size;
 270}
 271
 272static ssize_t tulip_receive_nc(NetClientState *nc,
 273                             const uint8_t *buf, size_t size)
 274{
 275    return tulip_receive(qemu_get_nic_opaque(nc), buf, size);
 276}
 277
 278
 279static NetClientInfo net_tulip_info = {
 280    .type = NET_CLIENT_DRIVER_NIC,
 281    .size = sizeof(NICState),
 282    .receive = tulip_receive_nc,
 283};
 284
 285static const char *tulip_reg_name(const hwaddr addr)
 286{
 287    switch (addr) {
 288    case CSR(0):
 289        return "CSR0";
 290
 291    case CSR(1):
 292        return "CSR1";
 293
 294    case CSR(2):
 295        return "CSR2";
 296
 297    case CSR(3):
 298        return "CSR3";
 299
 300    case CSR(4):
 301        return "CSR4";
 302
 303    case CSR(5):
 304        return "CSR5";
 305
 306    case CSR(6):
 307        return "CSR6";
 308
 309    case CSR(7):
 310        return "CSR7";
 311
 312    case CSR(8):
 313        return "CSR8";
 314
 315    case CSR(9):
 316        return "CSR9";
 317
 318    case CSR(10):
 319        return "CSR10";
 320
 321    case CSR(11):
 322        return "CSR11";
 323
 324    case CSR(12):
 325        return "CSR12";
 326
 327    case CSR(13):
 328        return "CSR13";
 329
 330    case CSR(14):
 331        return "CSR14";
 332
 333    case CSR(15):
 334        return "CSR15";
 335
 336    default:
 337        break;
 338    }
 339    return "";
 340}
 341
 342static const char *tulip_rx_state_name(int state)
 343{
 344    switch (state) {
 345    case CSR5_RS_STOPPED:
 346        return "STOPPED";
 347
 348    case CSR5_RS_RUNNING_FETCH:
 349        return "RUNNING/FETCH";
 350
 351    case CSR5_RS_RUNNING_CHECK_EOR:
 352        return "RUNNING/CHECK EOR";
 353
 354    case CSR5_RS_RUNNING_WAIT_RECEIVE:
 355        return "WAIT RECEIVE";
 356
 357    case CSR5_RS_SUSPENDED:
 358        return "SUSPENDED";
 359
 360    case CSR5_RS_RUNNING_CLOSE:
 361        return "RUNNING/CLOSE";
 362
 363    case CSR5_RS_RUNNING_FLUSH:
 364        return "RUNNING/FLUSH";
 365
 366    case CSR5_RS_RUNNING_QUEUE:
 367        return "RUNNING/QUEUE";
 368
 369    default:
 370        break;
 371    }
 372    return "";
 373}
 374
 375static const char *tulip_tx_state_name(int state)
 376{
 377    switch (state) {
 378    case CSR5_TS_STOPPED:
 379        return "STOPPED";
 380
 381    case CSR5_TS_RUNNING_FETCH:
 382        return "RUNNING/FETCH";
 383
 384    case CSR5_TS_RUNNING_WAIT_EOT:
 385        return "RUNNING/WAIT EOT";
 386
 387    case CSR5_TS_RUNNING_READ_BUF:
 388        return "RUNNING/READ BUF";
 389
 390    case CSR5_TS_RUNNING_SETUP:
 391        return "RUNNING/SETUP";
 392
 393    case CSR5_TS_SUSPENDED:
 394        return "SUSPENDED";
 395
 396    case CSR5_TS_RUNNING_CLOSE:
 397        return "RUNNING/CLOSE";
 398
 399    default:
 400        break;
 401    }
 402    return "";
 403}
 404
 405static void tulip_update_rs(TULIPState *s, int state)
 406{
 407    s->csr[5] &= ~(CSR5_RS_MASK << CSR5_RS_SHIFT);
 408    s->csr[5] |= (state & CSR5_RS_MASK) << CSR5_RS_SHIFT;
 409    trace_tulip_rx_state(tulip_rx_state_name(state));
 410}
 411
 412static uint16_t tulip_mdi_default[] = {
 413    /* MDI Registers 0 - 6, 7 */
 414    0x3100, 0xf02c, 0x7810, 0x0000, 0x0501, 0x4181, 0x0000, 0x0000,
 415    /* MDI Registers 8 - 15 */
 416    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 417    /* MDI Registers 16 - 31 */
 418    0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 419    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 420};
 421
 422/* Readonly mask for MDI (PHY) registers */
 423static const uint16_t tulip_mdi_mask[] = {
 424    0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
 425    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 426    0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 427    0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 428};
 429
 430static uint16_t tulip_mii_read(TULIPState *s, int phy, int reg)
 431{
 432    uint16_t ret = 0;
 433    if (phy == 1) {
 434        ret = tulip_mdi_default[reg];
 435    }
 436    trace_tulip_mii_read(phy, reg, ret);
 437    return ret;
 438}
 439
 440static void tulip_mii_write(TULIPState *s, int phy, int reg, uint16_t data)
 441{
 442    trace_tulip_mii_write(phy, reg, data);
 443
 444    if (phy != 1) {
 445        return;
 446    }
 447
 448    tulip_mdi_default[reg] &= ~tulip_mdi_mask[reg];
 449    tulip_mdi_default[reg] |= (data & tulip_mdi_mask[reg]);
 450}
 451
 452static void tulip_mii(TULIPState *s)
 453{
 454    uint32_t changed = s->old_csr9 ^ s->csr[9];
 455    uint16_t data;
 456    int op, phy, reg;
 457
 458    if (!(changed & CSR9_MDC)) {
 459        return;
 460    }
 461
 462    if (!(s->csr[9] & CSR9_MDC)) {
 463        return;
 464    }
 465
 466    s->mii_bitcnt++;
 467    s->mii_word <<= 1;
 468
 469    if (s->csr[9] & CSR9_MDO && (s->mii_bitcnt < 16 ||
 470        !(s->csr[9] & CSR9_MII))) {
 471        /* write op or address bits */
 472        s->mii_word |= 1;
 473    }
 474
 475    if (s->mii_bitcnt >= 16 && (s->csr[9] & CSR9_MII)) {
 476        if (s->mii_word & 0x8000) {
 477            s->csr[9] |= CSR9_MDI;
 478        } else {
 479            s->csr[9] &= ~CSR9_MDI;
 480        }
 481    }
 482
 483    if (s->mii_word == 0xffffffff) {
 484        s->mii_bitcnt = 0;
 485    } else if (s->mii_bitcnt == 16) {
 486        op = (s->mii_word >> 12) & 0x0f;
 487        phy = (s->mii_word >> 7) & 0x1f;
 488        reg = (s->mii_word >> 2) & 0x1f;
 489
 490        if (op == 6) {
 491            s->mii_word = tulip_mii_read(s, phy, reg);
 492        }
 493    } else if (s->mii_bitcnt == 32) {
 494            op = (s->mii_word >> 28) & 0x0f;
 495            phy = (s->mii_word >> 23) & 0x1f;
 496            reg = (s->mii_word >> 18) & 0x1f;
 497            data = s->mii_word & 0xffff;
 498
 499        if (op == 5) {
 500            tulip_mii_write(s, phy, reg, data);
 501        }
 502    }
 503}
 504
 505static uint32_t tulip_csr9_read(TULIPState *s)
 506{
 507    if (s->csr[9] & CSR9_SR) {
 508        if (eeprom93xx_read(s->eeprom)) {
 509            s->csr[9] |= CSR9_SR_DO;
 510        } else {
 511            s->csr[9] &= ~CSR9_SR_DO;
 512        }
 513    }
 514
 515    tulip_mii(s);
 516    return s->csr[9];
 517}
 518
 519static void tulip_update_ts(TULIPState *s, int state)
 520{
 521        s->csr[5] &= ~(CSR5_TS_MASK << CSR5_TS_SHIFT);
 522        s->csr[5] |= (state & CSR5_TS_MASK) << CSR5_TS_SHIFT;
 523        trace_tulip_tx_state(tulip_tx_state_name(state));
 524}
 525
 526static uint64_t tulip_read(void *opaque, hwaddr addr,
 527                              unsigned size)
 528{
 529    TULIPState *s = opaque;
 530    uint64_t data = 0;
 531
 532    switch (addr) {
 533    case CSR(9):
 534        data = tulip_csr9_read(s);
 535        break;
 536
 537    case CSR(12):
 538        /* Fake autocompletion complete until we have PHY emulation */
 539        data = 5 << CSR12_ANS_SHIFT;
 540        break;
 541
 542    default:
 543        if (addr & 7) {
 544            qemu_log_mask(LOG_GUEST_ERROR, "%s: read access at unknown address"
 545                " 0x%"PRIx64"\n", __func__, addr);
 546        } else {
 547            data = s->csr[addr >> 3];
 548        }
 549        break;
 550    }
 551    trace_tulip_reg_read(addr, tulip_reg_name(addr), size, data);
 552    return data;
 553}
 554
 555static void tulip_tx(TULIPState *s, struct tulip_descriptor *desc)
 556{
 557    if (s->tx_frame_len) {
 558        if ((s->csr[6] >> CSR6_OM_SHIFT) & CSR6_OM_MASK) {
 559            /* Internal or external Loopback */
 560            tulip_receive(s, s->tx_frame, s->tx_frame_len);
 561        } else {
 562            qemu_send_packet(qemu_get_queue(s->nic),
 563                s->tx_frame, s->tx_frame_len);
 564        }
 565    }
 566
 567    if (desc->control & TDES1_IC) {
 568        s->csr[5] |= CSR5_TI;
 569        tulip_update_int(s);
 570    }
 571}
 572
 573static void tulip_copy_tx_buffers(TULIPState *s, struct tulip_descriptor *desc)
 574{
 575    int len1 = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
 576    int len2 = (desc->control >> TDES1_BUF2_SIZE_SHIFT) & TDES1_BUF2_SIZE_MASK;
 577
 578    if (len1) {
 579        pci_dma_read(&s->dev, desc->buf_addr1,
 580            s->tx_frame + s->tx_frame_len, len1);
 581        s->tx_frame_len += len1;
 582    }
 583
 584    if (len2) {
 585        pci_dma_read(&s->dev, desc->buf_addr2,
 586            s->tx_frame + s->tx_frame_len, len2);
 587        s->tx_frame_len += len2;
 588    }
 589    desc->status = (len1 + len2) ? 0 : 0x7fffffff;
 590}
 591
 592static void tulip_setup_filter_addr(TULIPState *s, uint8_t *buf, int n)
 593{
 594    int offset = n * 12;
 595
 596    s->filter[n][0] = buf[offset];
 597    s->filter[n][1] = buf[offset + 1];
 598
 599    s->filter[n][2] = buf[offset + 4];
 600    s->filter[n][3] = buf[offset + 5];
 601
 602    s->filter[n][4] = buf[offset + 8];
 603    s->filter[n][5] = buf[offset + 9];
 604
 605    trace_tulip_setup_filter(n, s->filter[n][5], s->filter[n][4],
 606            s->filter[n][3], s->filter[n][2], s->filter[n][1], s->filter[n][0]);
 607}
 608
 609static void tulip_setup_frame(TULIPState *s,
 610        struct tulip_descriptor *desc)
 611{
 612    uint8_t buf[4096];
 613    int len = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
 614    int i;
 615
 616    trace_tulip_setup_frame();
 617
 618    if (len == 192) {
 619        pci_dma_read(&s->dev, desc->buf_addr1, buf, len);
 620        for (i = 0; i < 16; i++) {
 621            tulip_setup_filter_addr(s, buf, i);
 622        }
 623    }
 624
 625    desc->status = 0x7fffffff;
 626
 627    if (desc->control & TDES1_IC) {
 628        s->csr[5] |= CSR5_TI;
 629        tulip_update_int(s);
 630    }
 631}
 632
 633static void tulip_next_tx_descriptor(TULIPState *s,
 634    struct tulip_descriptor *desc)
 635{
 636    if (desc->control & TDES1_TER) {
 637        s->current_tx_desc = s->csr[4];
 638    } else if (desc->control & TDES1_TCH) {
 639        s->current_tx_desc = desc->buf_addr2;
 640    } else {
 641        s->current_tx_desc += sizeof(struct tulip_descriptor) +
 642                (((s->csr[0] >> CSR0_DSL_SHIFT) & CSR0_DSL_MASK) << 2);
 643    }
 644    s->current_tx_desc &= ~3ULL;
 645}
 646
 647static uint32_t tulip_ts(TULIPState *s)
 648{
 649    return (s->csr[5] >> CSR5_TS_SHIFT) & CSR5_TS_MASK;
 650}
 651
 652static void tulip_xmit_list_update(TULIPState *s)
 653{
 654    struct tulip_descriptor desc;
 655
 656    if (tulip_ts(s) != CSR5_TS_SUSPENDED) {
 657        return;
 658    }
 659
 660    for (;;) {
 661        tulip_desc_read(s, s->current_tx_desc, &desc);
 662        tulip_dump_tx_descriptor(s, &desc);
 663
 664        if (!(desc.status & TDES0_OWN)) {
 665            tulip_update_ts(s, CSR5_TS_SUSPENDED);
 666            s->csr[5] |= CSR5_TU;
 667            tulip_update_int(s);
 668            return;
 669        }
 670
 671        if (desc.control & TDES1_SET) {
 672            tulip_setup_frame(s, &desc);
 673        } else {
 674            if (desc.control & TDES1_FS) {
 675                s->tx_frame_len = 0;
 676            }
 677
 678            tulip_copy_tx_buffers(s, &desc);
 679
 680            if (desc.control & TDES1_LS) {
 681                tulip_tx(s, &desc);
 682            }
 683        }
 684        tulip_desc_write(s, s->current_tx_desc, &desc);
 685        tulip_next_tx_descriptor(s, &desc);
 686    }
 687}
 688
 689static void tulip_csr9_write(TULIPState *s, uint32_t old_val,
 690        uint32_t new_val)
 691{
 692    if (new_val & CSR9_SR) {
 693        eeprom93xx_write(s->eeprom,
 694            !!(new_val & CSR9_SR_CS),
 695            !!(new_val & CSR9_SR_SK),
 696            !!(new_val & CSR9_SR_DI));
 697    }
 698}
 699
 700static void tulip_reset(TULIPState *s)
 701{
 702    trace_tulip_reset();
 703
 704    s->csr[0] = 0xfe000000;
 705    s->csr[1] = 0xffffffff;
 706    s->csr[2] = 0xffffffff;
 707    s->csr[5] = 0xf0000000;
 708    s->csr[6] = 0x32000040;
 709    s->csr[7] = 0xf3fe0000;
 710    s->csr[8] = 0xe0000000;
 711    s->csr[9] = 0xfff483ff;
 712    s->csr[11] = 0xfffe0000;
 713    s->csr[12] = 0x000000c6;
 714    s->csr[13] = 0xffff0000;
 715    s->csr[14] = 0xffffffff;
 716    s->csr[15] = 0x8ff00000;
 717}
 718
 719static void tulip_qdev_reset(DeviceState *dev)
 720{
 721    PCIDevice *d = PCI_DEVICE(dev);
 722    TULIPState *s = TULIP(d);
 723
 724    tulip_reset(s);
 725}
 726
 727static void tulip_write(void *opaque, hwaddr addr,
 728                           uint64_t data, unsigned size)
 729{
 730    TULIPState *s = opaque;
 731    trace_tulip_reg_write(addr, tulip_reg_name(addr), size, data);
 732
 733    switch (addr) {
 734    case CSR(0):
 735        s->csr[0] = data;
 736        if (data & CSR0_SWR) {
 737            tulip_reset(s);
 738            tulip_update_int(s);
 739        }
 740        break;
 741
 742    case CSR(1):
 743        tulip_xmit_list_update(s);
 744        break;
 745
 746    case CSR(2):
 747        qemu_flush_queued_packets(qemu_get_queue(s->nic));
 748        break;
 749
 750    case CSR(3):
 751        s->csr[3] = data & ~3ULL;
 752        s->current_rx_desc = s->csr[3];
 753        qemu_flush_queued_packets(qemu_get_queue(s->nic));
 754        break;
 755
 756    case CSR(4):
 757        s->csr[4] = data & ~3ULL;
 758        s->current_tx_desc = s->csr[4];
 759        tulip_xmit_list_update(s);
 760        break;
 761
 762    case CSR(5):
 763        /* Status register, write clears bit */
 764        s->csr[5] &= ~(data & (CSR5_TI | CSR5_TPS | CSR5_TU | CSR5_TJT |
 765                               CSR5_LNP_ANC | CSR5_UNF | CSR5_RI | CSR5_RU |
 766                               CSR5_RPS | CSR5_RWT | CSR5_ETI | CSR5_GTE |
 767                               CSR5_LNF | CSR5_FBE | CSR5_ERI | CSR5_AIS |
 768                               CSR5_NIS | CSR5_GPI | CSR5_LC));
 769        tulip_update_int(s);
 770        break;
 771
 772    case CSR(6):
 773        s->csr[6] = data;
 774        if (s->csr[6] & CSR6_SR) {
 775            tulip_update_rs(s, CSR5_RS_RUNNING_WAIT_RECEIVE);
 776            qemu_flush_queued_packets(qemu_get_queue(s->nic));
 777        } else {
 778            tulip_update_rs(s, CSR5_RS_STOPPED);
 779        }
 780
 781        if (s->csr[6] & CSR6_ST) {
 782            tulip_update_ts(s, CSR5_TS_SUSPENDED);
 783            tulip_xmit_list_update(s);
 784        } else {
 785            tulip_update_ts(s, CSR5_TS_STOPPED);
 786        }
 787        break;
 788
 789    case CSR(7):
 790        s->csr[7] = data;
 791        tulip_update_int(s);
 792        break;
 793
 794    case CSR(8):
 795        s->csr[9] = data;
 796        break;
 797
 798    case CSR(9):
 799        tulip_csr9_write(s, s->csr[9], data);
 800        /* don't clear MII read data */
 801        s->csr[9] &= CSR9_MDI;
 802        s->csr[9] |= (data & ~CSR9_MDI);
 803        tulip_mii(s);
 804        s->old_csr9 = s->csr[9];
 805        break;
 806
 807    case CSR(10):
 808        s->csr[10] = data;
 809        break;
 810
 811    case CSR(11):
 812        s->csr[11] = data;
 813        break;
 814
 815    case CSR(12):
 816        /* SIA Status register, some bits are cleared by writing 1 */
 817        s->csr[12] &= ~(data & (CSR12_MRA | CSR12_TRA | CSR12_ARA));
 818        break;
 819
 820    case CSR(13):
 821        s->csr[13] = data;
 822        break;
 823
 824    case CSR(14):
 825        s->csr[14] = data;
 826        break;
 827
 828    case CSR(15):
 829        s->csr[15] = data;
 830        break;
 831
 832    default:
 833        qemu_log_mask(LOG_GUEST_ERROR, "%s: write to CSR at unknown address "
 834                "0x%"PRIx64"\n", __func__, addr);
 835        break;
 836    }
 837}
 838
 839static const MemoryRegionOps tulip_ops = {
 840    .read = tulip_read,
 841    .write = tulip_write,
 842    .endianness = DEVICE_LITTLE_ENDIAN,
 843    .impl = {
 844        .min_access_size = 4,
 845        .max_access_size = 4,
 846    },
 847};
 848
 849static void tulip_idblock_crc(TULIPState *s, uint16_t *srom)
 850{
 851    int word, n;
 852    int bit;
 853    unsigned char bitval, crc;
 854    const int len = 9;
 855    n = 0;
 856    crc = -1;
 857
 858    for (word = 0; word < len; word++) {
 859        for (bit = 15; bit >= 0; bit--) {
 860            if ((word == (len - 1)) && (bit == 7)) {
 861                /*
 862                 * Insert the correct CRC result into input data stream
 863                 * in place.
 864                 */
 865                srom[len - 1] = (srom[len - 1] & 0xff00) | (unsigned short)crc;
 866                break;
 867            }
 868            n++;
 869            bitval = ((srom[word] >> bit) & 1) ^ ((crc >> 7) & 1);
 870            crc = crc << 1;
 871            if (bitval == 1) {
 872                crc ^= 6;
 873                crc |= 0x01;
 874            }
 875        }
 876    }
 877}
 878
 879static uint16_t tulip_srom_crc(TULIPState *s, uint8_t *eeprom, size_t len)
 880{
 881    unsigned long crc = 0xffffffff;
 882    unsigned long flippedcrc = 0;
 883    unsigned char currentbyte;
 884    unsigned int msb, bit, i;
 885
 886    for (i = 0; i < len; i++) {
 887        currentbyte = eeprom[i];
 888        for (bit = 0; bit < 8; bit++) {
 889            msb = (crc >> 31) & 1;
 890            crc <<= 1;
 891            if (msb ^ (currentbyte & 1)) {
 892                crc ^= 0x04c11db6;
 893                crc |= 0x00000001;
 894            }
 895            currentbyte >>= 1;
 896        }
 897    }
 898
 899    for (i = 0; i < 32; i++) {
 900        flippedcrc <<= 1;
 901        bit = crc & 1;
 902        crc >>= 1;
 903        flippedcrc += bit;
 904    }
 905    return (flippedcrc ^ 0xffffffff) & 0xffff;
 906}
 907
 908static const uint8_t eeprom_default[128] = {
 909    0x3c, 0x10, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00,
 910    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 911    0x56, 0x08, 0x04, 0x01, 0x00, 0x80, 0x48, 0xb3,
 912    0x0e, 0xa7, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x08,
 913    0x01, 0x8d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x78,
 914    0xe0, 0x01, 0x00, 0x50, 0x00, 0x18, 0x00, 0x00,
 915    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 916    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 917    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 918    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 919    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 920    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6b,
 921    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
 922    0x48, 0xb3, 0x0e, 0xa7, 0x40, 0x00, 0x00, 0x00,
 923    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 924    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 925};
 926
 927static void tulip_fill_eeprom(TULIPState *s)
 928{
 929    uint16_t *eeprom = eeprom93xx_data(s->eeprom);
 930    memcpy(eeprom, eeprom_default, 128);
 931
 932    /* patch in our mac address */
 933    eeprom[10] = cpu_to_le16(s->c.macaddr.a[0] | (s->c.macaddr.a[1] << 8));
 934    eeprom[11] = cpu_to_le16(s->c.macaddr.a[2] | (s->c.macaddr.a[3] << 8));
 935    eeprom[12] = cpu_to_le16(s->c.macaddr.a[4] | (s->c.macaddr.a[5] << 8));
 936    tulip_idblock_crc(s, eeprom);
 937    eeprom[63] = cpu_to_le16(tulip_srom_crc(s, (uint8_t *)eeprom, 126));
 938}
 939
 940static void pci_tulip_realize(PCIDevice *pci_dev, Error **errp)
 941{
 942    TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
 943    uint8_t *pci_conf;
 944
 945    pci_conf = s->dev.config;
 946    pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
 947
 948    s->eeprom = eeprom93xx_new(&pci_dev->qdev, 64);
 949    tulip_fill_eeprom(s);
 950
 951    memory_region_init_io(&s->io, OBJECT(&s->dev), &tulip_ops, s,
 952            "tulip-io", 128);
 953
 954    memory_region_init_io(&s->memory, OBJECT(&s->dev), &tulip_ops, s,
 955            "tulip-mem", 128);
 956
 957    pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
 958    pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->memory);
 959
 960    s->irq = pci_allocate_irq(&s->dev);
 961
 962    qemu_macaddr_default_if_unset(&s->c.macaddr);
 963
 964    s->nic = qemu_new_nic(&net_tulip_info, &s->c,
 965                          object_get_typename(OBJECT(pci_dev)),
 966                          pci_dev->qdev.id, s);
 967    qemu_format_nic_info_str(qemu_get_queue(s->nic), s->c.macaddr.a);
 968}
 969
 970static void pci_tulip_exit(PCIDevice *pci_dev)
 971{
 972    TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
 973
 974    qemu_del_nic(s->nic);
 975    qemu_free_irq(s->irq);
 976    eeprom93xx_free(&pci_dev->qdev, s->eeprom);
 977}
 978
 979static void tulip_instance_init(Object *obj)
 980{
 981    PCIDevice *pci_dev = PCI_DEVICE(obj);
 982    TULIPState *d = DO_UPCAST(TULIPState, dev, pci_dev);
 983
 984    device_add_bootindex_property(obj, &d->c.bootindex,
 985                                  "bootindex", "/ethernet-phy@0",
 986                                  &pci_dev->qdev, NULL);
 987}
 988
 989static Property tulip_properties[] = {
 990    DEFINE_NIC_PROPERTIES(TULIPState, c),
 991    DEFINE_PROP_END_OF_LIST(),
 992};
 993
 994static void tulip_class_init(ObjectClass *klass, void *data)
 995{
 996    DeviceClass *dc = DEVICE_CLASS(klass);
 997    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 998
 999    k->realize = pci_tulip_realize;
1000    k->exit = pci_tulip_exit;
1001    k->vendor_id = PCI_VENDOR_ID_DEC;
1002    k->device_id = PCI_DEVICE_ID_DEC_21143;
1003    k->subsystem_vendor_id = 0x103c;
1004    k->subsystem_id = 0x104f;
1005    k->class_id = PCI_CLASS_NETWORK_ETHERNET;
1006    dc->vmsd = &vmstate_pci_tulip;
1007    dc->props = tulip_properties;
1008    dc->reset = tulip_qdev_reset;
1009    set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
1010}
1011
1012static const TypeInfo tulip_info = {
1013    .name          = TYPE_TULIP,
1014    .parent        = TYPE_PCI_DEVICE,
1015    .instance_size = sizeof(TULIPState),
1016    .class_init    = tulip_class_init,
1017    .instance_init = tulip_instance_init,
1018    .interfaces = (InterfaceInfo[]) {
1019        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
1020        { },
1021    },
1022};
1023
1024static void tulip_register_types(void)
1025{
1026    type_register_static(&tulip_info);
1027}
1028
1029type_init(tulip_register_types)
1030