qemu/hw/net/eepro100.c
<<
>>
Prefs
   1/*
   2 * QEMU i8255x (PRO100) emulation
   3 *
   4 * Copyright (C) 2006-2011 Stefan Weil
   5 *
   6 * Portions of the code are copies from grub / etherboot eepro100.c
   7 * and linux e100.c.
   8 *
   9 * This program is free software: you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation, either version 2 of the License, or
  12 * (at your option) version 3 or any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  21 *
  22 * Tested features (i82559):
  23 *      PXE boot (i386 guest, i386 / mips / mipsel / ppc host) ok
  24 *      Linux networking (i386) ok
  25 *
  26 * Untested:
  27 *      Windows networking
  28 *
  29 * References:
  30 *
  31 * Intel 8255x 10/100 Mbps Ethernet Controller Family
  32 * Open Source Software Developer Manual
  33 *
  34 * TODO:
  35 *      * PHY emulation should be separated from nic emulation.
  36 *        Most nic emulations could share the same phy code.
  37 *      * i82550 is untested. It is programmed like the i82559.
  38 *      * i82562 is untested. It is programmed like the i82559.
  39 *      * Power management (i82558 and later) is not implemented.
  40 *      * Wake-on-LAN is not implemented.
  41 */
  42
  43#include "qemu/osdep.h"
  44#include "hw/hw.h"
  45#include "hw/pci/pci.h"
  46#include "net/net.h"
  47#include "hw/nvram/eeprom93xx.h"
  48#include "sysemu/sysemu.h"
  49#include "sysemu/dma.h"
  50#include "qemu/bitops.h"
  51#include "qapi/error.h"
  52
  53/* QEMU sends frames smaller than 60 bytes to ethernet nics.
  54 * Such frames are rejected by real nics and their emulations.
  55 * To avoid this behaviour, other nic emulations pad received
  56 * frames. The following definition enables this padding for
  57 * eepro100, too. We keep the define around in case it might
  58 * become useful the future if the core networking is ever
  59 * changed to pad short packets itself. */
  60#define CONFIG_PAD_RECEIVED_FRAMES
  61
  62#define KiB 1024
  63
  64/* Debug EEPRO100 card. */
  65#if 0
  66# define DEBUG_EEPRO100
  67#endif
  68
  69#ifdef DEBUG_EEPRO100
  70#define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
  71#else
  72#define logout(fmt, ...) ((void)0)
  73#endif
  74
  75/* Set flags to 0 to disable debug output. */
  76#define INT     1       /* interrupt related actions */
  77#define MDI     1       /* mdi related actions */
  78#define OTHER   1
  79#define RXTX    1
  80#define EEPROM  1       /* eeprom related actions */
  81
  82#define TRACE(flag, command) ((flag) ? (command) : (void)0)
  83
  84#define missing(text) fprintf(stderr, "eepro100: feature is missing in this emulation: " text "\n")
  85
  86#define MAX_ETH_FRAME_SIZE 1514
  87
  88/* This driver supports several different devices which are declared here. */
  89#define i82550          0x82550
  90#define i82551          0x82551
  91#define i82557A         0x82557a
  92#define i82557B         0x82557b
  93#define i82557C         0x82557c
  94#define i82558A         0x82558a
  95#define i82558B         0x82558b
  96#define i82559A         0x82559a
  97#define i82559B         0x82559b
  98#define i82559C         0x82559c
  99#define i82559ER        0x82559e
 100#define i82562          0x82562
 101#define i82801          0x82801
 102
 103/* Use 64 word EEPROM. TODO: could be a runtime option. */
 104#define EEPROM_SIZE     64
 105
 106#define PCI_MEM_SIZE            (4 * KiB)
 107#define PCI_IO_SIZE             64
 108#define PCI_FLASH_SIZE          (128 * KiB)
 109
 110#define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
 111
 112/* The SCB accepts the following controls for the Tx and Rx units: */
 113#define  CU_NOP         0x0000  /* No operation. */
 114#define  CU_START       0x0010  /* CU start. */
 115#define  CU_RESUME      0x0020  /* CU resume. */
 116#define  CU_STATSADDR   0x0040  /* Load dump counters address. */
 117#define  CU_SHOWSTATS   0x0050  /* Dump statistical counters. */
 118#define  CU_CMD_BASE    0x0060  /* Load CU base address. */
 119#define  CU_DUMPSTATS   0x0070  /* Dump and reset statistical counters. */
 120#define  CU_SRESUME     0x00a0  /* CU static resume. */
 121
 122#define  RU_NOP         0x0000
 123#define  RX_START       0x0001
 124#define  RX_RESUME      0x0002
 125#define  RU_ABORT       0x0004
 126#define  RX_ADDR_LOAD   0x0006
 127#define  RX_RESUMENR    0x0007
 128#define INT_MASK        0x0100
 129#define DRVR_INT        0x0200  /* Driver generated interrupt. */
 130
 131typedef struct {
 132    const char *name;
 133    const char *desc;
 134    uint16_t device_id;
 135    uint8_t revision;
 136    uint16_t subsystem_vendor_id;
 137    uint16_t subsystem_id;
 138
 139    uint32_t device;
 140    uint8_t stats_size;
 141    bool has_extended_tcb_support;
 142    bool power_management;
 143} E100PCIDeviceInfo;
 144
 145/* Offsets to the various registers.
 146   All accesses need not be longword aligned. */
 147typedef enum {
 148    SCBStatus = 0,              /* Status Word. */
 149    SCBAck = 1,
 150    SCBCmd = 2,                 /* Rx/Command Unit command and status. */
 151    SCBIntmask = 3,
 152    SCBPointer = 4,             /* General purpose pointer. */
 153    SCBPort = 8,                /* Misc. commands and operands.  */
 154    SCBflash = 12,              /* Flash memory control. */
 155    SCBeeprom = 14,             /* EEPROM control. */
 156    SCBCtrlMDI = 16,            /* MDI interface control. */
 157    SCBEarlyRx = 20,            /* Early receive byte count. */
 158    SCBFlow = 24,               /* Flow Control. */
 159    SCBpmdr = 27,               /* Power Management Driver. */
 160    SCBgctrl = 28,              /* General Control. */
 161    SCBgstat = 29,              /* General Status. */
 162} E100RegisterOffset;
 163
 164/* A speedo3 transmit buffer descriptor with two buffers... */
 165typedef struct {
 166    uint16_t status;
 167    uint16_t command;
 168    uint32_t link;              /* void * */
 169    uint32_t tbd_array_addr;    /* transmit buffer descriptor array address. */
 170    uint16_t tcb_bytes;         /* transmit command block byte count (in lower 14 bits */
 171    uint8_t tx_threshold;       /* transmit threshold */
 172    uint8_t tbd_count;          /* TBD number */
 173#if 0
 174    /* This constitutes two "TBD" entries: hdr and data */
 175    uint32_t tx_buf_addr0;  /* void *, header of frame to be transmitted.  */
 176    int32_t  tx_buf_size0;  /* Length of Tx hdr. */
 177    uint32_t tx_buf_addr1;  /* void *, data to be transmitted.  */
 178    int32_t  tx_buf_size1;  /* Length of Tx data. */
 179#endif
 180} eepro100_tx_t;
 181
 182/* Receive frame descriptor. */
 183typedef struct {
 184    int16_t status;
 185    uint16_t command;
 186    uint32_t link;              /* struct RxFD * */
 187    uint32_t rx_buf_addr;       /* void * */
 188    uint16_t count;
 189    uint16_t size;
 190    /* Ethernet frame data follows. */
 191} eepro100_rx_t;
 192
 193typedef enum {
 194    COMMAND_EL = BIT(15),
 195    COMMAND_S = BIT(14),
 196    COMMAND_I = BIT(13),
 197    COMMAND_NC = BIT(4),
 198    COMMAND_SF = BIT(3),
 199    COMMAND_CMD = BITS(2, 0),
 200} scb_command_bit;
 201
 202typedef enum {
 203    STATUS_C = BIT(15),
 204    STATUS_OK = BIT(13),
 205} scb_status_bit;
 206
 207typedef struct {
 208    uint32_t tx_good_frames, tx_max_collisions, tx_late_collisions,
 209             tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
 210             tx_multiple_collisions, tx_total_collisions;
 211    uint32_t rx_good_frames, rx_crc_errors, rx_alignment_errors,
 212             rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
 213             rx_short_frame_errors;
 214    uint32_t fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
 215    uint16_t xmt_tco_frames, rcv_tco_frames;
 216    /* TODO: i82559 has six reserved statistics but a total of 24 dwords. */
 217    uint32_t reserved[4];
 218} eepro100_stats_t;
 219
 220typedef enum {
 221    cu_idle = 0,
 222    cu_suspended = 1,
 223    cu_active = 2,
 224    cu_lpq_active = 2,
 225    cu_hqp_active = 3
 226} cu_state_t;
 227
 228typedef enum {
 229    ru_idle = 0,
 230    ru_suspended = 1,
 231    ru_no_resources = 2,
 232    ru_ready = 4
 233} ru_state_t;
 234
 235typedef struct {
 236    PCIDevice dev;
 237    /* Hash register (multicast mask array, multiple individual addresses). */
 238    uint8_t mult[8];
 239    MemoryRegion mmio_bar;
 240    MemoryRegion io_bar;
 241    MemoryRegion flash_bar;
 242    NICState *nic;
 243    NICConf conf;
 244    uint8_t scb_stat;           /* SCB stat/ack byte */
 245    uint8_t int_stat;           /* PCI interrupt status */
 246    /* region must not be saved by nic_save. */
 247    uint16_t mdimem[32];
 248    eeprom_t *eeprom;
 249    uint32_t device;            /* device variant */
 250    /* (cu_base + cu_offset) address the next command block in the command block list. */
 251    uint32_t cu_base;           /* CU base address */
 252    uint32_t cu_offset;         /* CU address offset */
 253    /* (ru_base + ru_offset) address the RFD in the Receive Frame Area. */
 254    uint32_t ru_base;           /* RU base address */
 255    uint32_t ru_offset;         /* RU address offset */
 256    uint32_t statsaddr;         /* pointer to eepro100_stats_t */
 257
 258    /* Temporary status information (no need to save these values),
 259     * used while processing CU commands. */
 260    eepro100_tx_t tx;           /* transmit buffer descriptor */
 261    uint32_t cb_address;        /* = cu_base + cu_offset */
 262
 263    /* Statistical counters. Also used for wake-up packet (i82559). */
 264    eepro100_stats_t statistics;
 265
 266    /* Data in mem is always in the byte order of the controller (le).
 267     * It must be dword aligned to allow direct access to 32 bit values. */
 268    uint8_t mem[PCI_MEM_SIZE] __attribute__((aligned(8)));
 269
 270    /* Configuration bytes. */
 271    uint8_t configuration[22];
 272
 273    /* vmstate for each particular nic */
 274    VMStateDescription *vmstate;
 275
 276    /* Quasi static device properties (no need to save them). */
 277    uint16_t stats_size;
 278    bool has_extended_tcb_support;
 279} EEPRO100State;
 280
 281/* Word indices in EEPROM. */
 282typedef enum {
 283    EEPROM_CNFG_MDIX  = 0x03,
 284    EEPROM_ID         = 0x05,
 285    EEPROM_PHY_ID     = 0x06,
 286    EEPROM_VENDOR_ID  = 0x0c,
 287    EEPROM_CONFIG_ASF = 0x0d,
 288    EEPROM_DEVICE_ID  = 0x23,
 289    EEPROM_SMBUS_ADDR = 0x90,
 290} EEPROMOffset;
 291
 292/* Bit values for EEPROM ID word. */
 293typedef enum {
 294    EEPROM_ID_MDM = BIT(0),     /* Modem */
 295    EEPROM_ID_STB = BIT(1),     /* Standby Enable */
 296    EEPROM_ID_WMR = BIT(2),     /* ??? */
 297    EEPROM_ID_WOL = BIT(5),     /* Wake on LAN */
 298    EEPROM_ID_DPD = BIT(6),     /* Deep Power Down */
 299    EEPROM_ID_ALT = BIT(7),     /* */
 300    /* BITS(10, 8) device revision */
 301    EEPROM_ID_BD = BIT(11),     /* boot disable */
 302    EEPROM_ID_ID = BIT(13),     /* id bit */
 303    /* BITS(15, 14) signature */
 304    EEPROM_ID_VALID = BIT(14),  /* signature for valid eeprom */
 305} eeprom_id_bit;
 306
 307/* Default values for MDI (PHY) registers */
 308static const uint16_t eepro100_mdi_default[] = {
 309    /* MDI Registers 0 - 6, 7 */
 310    0x3000, 0x780d, 0x02a8, 0x0154, 0x05e1, 0x0000, 0x0000, 0x0000,
 311    /* MDI Registers 8 - 15 */
 312    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 313    /* MDI Registers 16 - 31 */
 314    0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 315    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 316};
 317
 318/* Readonly mask for MDI (PHY) registers */
 319static const uint16_t eepro100_mdi_mask[] = {
 320    0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
 321    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 322    0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 323    0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 324};
 325
 326#define POLYNOMIAL 0x04c11db6
 327
 328static E100PCIDeviceInfo *eepro100_get_class(EEPRO100State *s);
 329
 330/* From FreeBSD (locally modified). */
 331static unsigned e100_compute_mcast_idx(const uint8_t *ep)
 332{
 333    uint32_t crc;
 334    int carry, i, j;
 335    uint8_t b;
 336
 337    crc = 0xffffffff;
 338    for (i = 0; i < 6; i++) {
 339        b = *ep++;
 340        for (j = 0; j < 8; j++) {
 341            carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
 342            crc <<= 1;
 343            b >>= 1;
 344            if (carry) {
 345                crc = ((crc ^ POLYNOMIAL) | carry);
 346            }
 347        }
 348    }
 349    return (crc & BITS(7, 2)) >> 2;
 350}
 351
 352/* Read a 16 bit control/status (CSR) register. */
 353static uint16_t e100_read_reg2(EEPRO100State *s, E100RegisterOffset addr)
 354{
 355    assert(!((uintptr_t)&s->mem[addr] & 1));
 356    return lduw_le_p(&s->mem[addr]);
 357}
 358
 359/* Read a 32 bit control/status (CSR) register. */
 360static uint32_t e100_read_reg4(EEPRO100State *s, E100RegisterOffset addr)
 361{
 362    assert(!((uintptr_t)&s->mem[addr] & 3));
 363    return ldl_le_p(&s->mem[addr]);
 364}
 365
 366/* Write a 16 bit control/status (CSR) register. */
 367static void e100_write_reg2(EEPRO100State *s, E100RegisterOffset addr,
 368                            uint16_t val)
 369{
 370    assert(!((uintptr_t)&s->mem[addr] & 1));
 371    stw_le_p(&s->mem[addr], val);
 372}
 373
 374/* Read a 32 bit control/status (CSR) register. */
 375static void e100_write_reg4(EEPRO100State *s, E100RegisterOffset addr,
 376                            uint32_t val)
 377{
 378    assert(!((uintptr_t)&s->mem[addr] & 3));
 379    stl_le_p(&s->mem[addr], val);
 380}
 381
 382#if defined(DEBUG_EEPRO100)
 383static const char *nic_dump(const uint8_t * buf, unsigned size)
 384{
 385    static char dump[3 * 16 + 1];
 386    char *p = &dump[0];
 387    if (size > 16) {
 388        size = 16;
 389    }
 390    while (size-- > 0) {
 391        p += sprintf(p, " %02x", *buf++);
 392    }
 393    return dump;
 394}
 395#endif                          /* DEBUG_EEPRO100 */
 396
 397enum scb_stat_ack {
 398    stat_ack_not_ours = 0x00,
 399    stat_ack_sw_gen = 0x04,
 400    stat_ack_rnr = 0x10,
 401    stat_ack_cu_idle = 0x20,
 402    stat_ack_frame_rx = 0x40,
 403    stat_ack_cu_cmd_done = 0x80,
 404    stat_ack_not_present = 0xFF,
 405    stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
 406    stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
 407};
 408
 409static void disable_interrupt(EEPRO100State * s)
 410{
 411    if (s->int_stat) {
 412        TRACE(INT, logout("interrupt disabled\n"));
 413        pci_irq_deassert(&s->dev);
 414        s->int_stat = 0;
 415    }
 416}
 417
 418static void enable_interrupt(EEPRO100State * s)
 419{
 420    if (!s->int_stat) {
 421        TRACE(INT, logout("interrupt enabled\n"));
 422        pci_irq_assert(&s->dev);
 423        s->int_stat = 1;
 424    }
 425}
 426
 427static void eepro100_acknowledge(EEPRO100State * s)
 428{
 429    s->scb_stat &= ~s->mem[SCBAck];
 430    s->mem[SCBAck] = s->scb_stat;
 431    if (s->scb_stat == 0) {
 432        disable_interrupt(s);
 433    }
 434}
 435
 436static void eepro100_interrupt(EEPRO100State * s, uint8_t status)
 437{
 438    uint8_t mask = ~s->mem[SCBIntmask];
 439    s->mem[SCBAck] |= status;
 440    status = s->scb_stat = s->mem[SCBAck];
 441    status &= (mask | 0x0f);
 442#if 0
 443    status &= (~s->mem[SCBIntmask] | 0x0xf);
 444#endif
 445    if (status && (mask & 0x01)) {
 446        /* SCB mask and SCB Bit M do not disable interrupt. */
 447        enable_interrupt(s);
 448    } else if (s->int_stat) {
 449        disable_interrupt(s);
 450    }
 451}
 452
 453static void eepro100_cx_interrupt(EEPRO100State * s)
 454{
 455    /* CU completed action command. */
 456    /* Transmit not ok (82557 only, not in emulation). */
 457    eepro100_interrupt(s, 0x80);
 458}
 459
 460static void eepro100_cna_interrupt(EEPRO100State * s)
 461{
 462    /* CU left the active state. */
 463    eepro100_interrupt(s, 0x20);
 464}
 465
 466static void eepro100_fr_interrupt(EEPRO100State * s)
 467{
 468    /* RU received a complete frame. */
 469    eepro100_interrupt(s, 0x40);
 470}
 471
 472static void eepro100_rnr_interrupt(EEPRO100State * s)
 473{
 474    /* RU is not ready. */
 475    eepro100_interrupt(s, 0x10);
 476}
 477
 478static void eepro100_mdi_interrupt(EEPRO100State * s)
 479{
 480    /* MDI completed read or write cycle. */
 481    eepro100_interrupt(s, 0x08);
 482}
 483
 484static void eepro100_swi_interrupt(EEPRO100State * s)
 485{
 486    /* Software has requested an interrupt. */
 487    eepro100_interrupt(s, 0x04);
 488}
 489
 490#if 0
 491static void eepro100_fcp_interrupt(EEPRO100State * s)
 492{
 493    /* Flow control pause interrupt (82558 and later). */
 494    eepro100_interrupt(s, 0x01);
 495}
 496#endif
 497
 498static void e100_pci_reset(EEPRO100State *s, Error **errp)
 499{
 500    E100PCIDeviceInfo *info = eepro100_get_class(s);
 501    uint32_t device = s->device;
 502    uint8_t *pci_conf = s->dev.config;
 503
 504    TRACE(OTHER, logout("%p\n", s));
 505
 506    /* PCI Status */
 507    pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
 508                                        PCI_STATUS_FAST_BACK);
 509    /* PCI Latency Timer */
 510    pci_set_byte(pci_conf + PCI_LATENCY_TIMER, 0x20);   /* latency timer = 32 clocks */
 511    /* Capability Pointer is set by PCI framework. */
 512    /* Interrupt Line */
 513    /* Interrupt Pin */
 514    pci_set_byte(pci_conf + PCI_INTERRUPT_PIN, 1);      /* interrupt pin A */
 515    /* Minimum Grant */
 516    pci_set_byte(pci_conf + PCI_MIN_GNT, 0x08);
 517    /* Maximum Latency */
 518    pci_set_byte(pci_conf + PCI_MAX_LAT, 0x18);
 519
 520    s->stats_size = info->stats_size;
 521    s->has_extended_tcb_support = info->has_extended_tcb_support;
 522
 523    switch (device) {
 524    case i82550:
 525    case i82551:
 526    case i82557A:
 527    case i82557B:
 528    case i82557C:
 529    case i82558A:
 530    case i82558B:
 531    case i82559A:
 532    case i82559B:
 533    case i82559ER:
 534    case i82562:
 535    case i82801:
 536    case i82559C:
 537        break;
 538    default:
 539        logout("Device %X is undefined!\n", device);
 540    }
 541
 542    /* Standard TxCB. */
 543    s->configuration[6] |= BIT(4);
 544
 545    /* Standard statistical counters. */
 546    s->configuration[6] |= BIT(5);
 547
 548    if (s->stats_size == 80) {
 549        /* TODO: check TCO Statistical Counters bit. Documentation not clear. */
 550        if (s->configuration[6] & BIT(2)) {
 551            /* TCO statistical counters. */
 552            assert(s->configuration[6] & BIT(5));
 553        } else {
 554            if (s->configuration[6] & BIT(5)) {
 555                /* No extended statistical counters, i82557 compatible. */
 556                s->stats_size = 64;
 557            } else {
 558                /* i82558 compatible. */
 559                s->stats_size = 76;
 560            }
 561        }
 562    } else {
 563        if (s->configuration[6] & BIT(5)) {
 564            /* No extended statistical counters. */
 565            s->stats_size = 64;
 566        }
 567    }
 568    assert(s->stats_size > 0 && s->stats_size <= sizeof(s->statistics));
 569
 570    if (info->power_management) {
 571        /* Power Management Capabilities */
 572        int cfg_offset = 0xdc;
 573        int r = pci_add_capability(&s->dev, PCI_CAP_ID_PM,
 574                                   cfg_offset, PCI_PM_SIZEOF,
 575                                   errp);
 576        if (r < 0) {
 577            return;
 578        }
 579
 580        pci_set_word(pci_conf + cfg_offset + PCI_PM_PMC, 0x7e21);
 581#if 0 /* TODO: replace dummy code for power management emulation. */
 582        /* TODO: Power Management Control / Status. */
 583        pci_set_word(pci_conf + cfg_offset + PCI_PM_CTRL, 0x0000);
 584        /* TODO: Ethernet Power Consumption Registers (i82559 and later). */
 585        pci_set_byte(pci_conf + cfg_offset + PCI_PM_PPB_EXTENSIONS, 0x0000);
 586#endif
 587    }
 588
 589#if EEPROM_SIZE > 0
 590    if (device == i82557C || device == i82558B || device == i82559C) {
 591        /*
 592        TODO: get vendor id from EEPROM for i82557C or later.
 593        TODO: get device id from EEPROM for i82557C or later.
 594        TODO: status bit 4 can be disabled by EEPROM for i82558, i82559.
 595        TODO: header type is determined by EEPROM for i82559.
 596        TODO: get subsystem id from EEPROM for i82557C or later.
 597        TODO: get subsystem vendor id from EEPROM for i82557C or later.
 598        TODO: exp. rom baddr depends on a bit in EEPROM for i82558 or later.
 599        TODO: capability pointer depends on EEPROM for i82558.
 600        */
 601        logout("Get device id and revision from EEPROM!!!\n");
 602    }
 603#endif /* EEPROM_SIZE > 0 */
 604}
 605
 606static void nic_selective_reset(EEPRO100State * s)
 607{
 608    size_t i;
 609    uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
 610#if 0
 611    eeprom93xx_reset(s->eeprom);
 612#endif
 613    memcpy(eeprom_contents, s->conf.macaddr.a, 6);
 614    eeprom_contents[EEPROM_ID] = EEPROM_ID_VALID;
 615    if (s->device == i82557B || s->device == i82557C)
 616        eeprom_contents[5] = 0x0100;
 617    eeprom_contents[EEPROM_PHY_ID] = 1;
 618    uint16_t sum = 0;
 619    for (i = 0; i < EEPROM_SIZE - 1; i++) {
 620        sum += eeprom_contents[i];
 621    }
 622    eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum;
 623    TRACE(EEPROM, logout("checksum=0x%04x\n", eeprom_contents[EEPROM_SIZE - 1]));
 624
 625    memset(s->mem, 0, sizeof(s->mem));
 626    e100_write_reg4(s, SCBCtrlMDI, BIT(21));
 627
 628    assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default));
 629    memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem));
 630}
 631
 632static void nic_reset(void *opaque)
 633{
 634    EEPRO100State *s = opaque;
 635    TRACE(OTHER, logout("%p\n", s));
 636    /* TODO: Clearing of hash register for selective reset, too? */
 637    memset(&s->mult[0], 0, sizeof(s->mult));
 638    nic_selective_reset(s);
 639}
 640
 641#if defined(DEBUG_EEPRO100)
 642static const char * const e100_reg[PCI_IO_SIZE / 4] = {
 643    "Command/Status",
 644    "General Pointer",
 645    "Port",
 646    "EEPROM/Flash Control",
 647    "MDI Control",
 648    "Receive DMA Byte Count",
 649    "Flow Control",
 650    "General Status/Control"
 651};
 652
 653static char *regname(uint32_t addr)
 654{
 655    static char buf[32];
 656    if (addr < PCI_IO_SIZE) {
 657        const char *r = e100_reg[addr / 4];
 658        if (r != 0) {
 659            snprintf(buf, sizeof(buf), "%s+%u", r, addr % 4);
 660        } else {
 661            snprintf(buf, sizeof(buf), "0x%02x", addr);
 662        }
 663    } else {
 664        snprintf(buf, sizeof(buf), "??? 0x%08x", addr);
 665    }
 666    return buf;
 667}
 668#endif                          /* DEBUG_EEPRO100 */
 669
 670/*****************************************************************************
 671 *
 672 * Command emulation.
 673 *
 674 ****************************************************************************/
 675
 676#if 0
 677static uint16_t eepro100_read_command(EEPRO100State * s)
 678{
 679    uint16_t val = 0xffff;
 680    TRACE(OTHER, logout("val=0x%04x\n", val));
 681    return val;
 682}
 683#endif
 684
 685/* Commands that can be put in a command list entry. */
 686enum commands {
 687    CmdNOp = 0,
 688    CmdIASetup = 1,
 689    CmdConfigure = 2,
 690    CmdMulticastList = 3,
 691    CmdTx = 4,
 692    CmdTDR = 5,                 /* load microcode */
 693    CmdDump = 6,
 694    CmdDiagnose = 7,
 695
 696    /* And some extra flags: */
 697    CmdSuspend = 0x4000,        /* Suspend after completion. */
 698    CmdIntr = 0x2000,           /* Interrupt after completion. */
 699    CmdTxFlex = 0x0008,         /* Use "Flexible mode" for CmdTx command. */
 700};
 701
 702static cu_state_t get_cu_state(EEPRO100State * s)
 703{
 704    return ((s->mem[SCBStatus] & BITS(7, 6)) >> 6);
 705}
 706
 707static void set_cu_state(EEPRO100State * s, cu_state_t state)
 708{
 709    s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(7, 6)) + (state << 6);
 710}
 711
 712static ru_state_t get_ru_state(EEPRO100State * s)
 713{
 714    return ((s->mem[SCBStatus] & BITS(5, 2)) >> 2);
 715}
 716
 717static void set_ru_state(EEPRO100State * s, ru_state_t state)
 718{
 719    s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(5, 2)) + (state << 2);
 720}
 721
 722static void dump_statistics(EEPRO100State * s)
 723{
 724    /* Dump statistical data. Most data is never changed by the emulation
 725     * and always 0, so we first just copy the whole block and then those
 726     * values which really matter.
 727     * Number of data should check configuration!!!
 728     */
 729    pci_dma_write(&s->dev, s->statsaddr, &s->statistics, s->stats_size);
 730    stl_le_pci_dma(&s->dev, s->statsaddr + 0,
 731                   s->statistics.tx_good_frames);
 732    stl_le_pci_dma(&s->dev, s->statsaddr + 36,
 733                   s->statistics.rx_good_frames);
 734    stl_le_pci_dma(&s->dev, s->statsaddr + 48,
 735                   s->statistics.rx_resource_errors);
 736    stl_le_pci_dma(&s->dev, s->statsaddr + 60,
 737                   s->statistics.rx_short_frame_errors);
 738#if 0
 739    stw_le_pci_dma(&s->dev, s->statsaddr + 76, s->statistics.xmt_tco_frames);
 740    stw_le_pci_dma(&s->dev, s->statsaddr + 78, s->statistics.rcv_tco_frames);
 741    missing("CU dump statistical counters");
 742#endif
 743}
 744
 745static void read_cb(EEPRO100State *s)
 746{
 747    pci_dma_read(&s->dev, s->cb_address, &s->tx, sizeof(s->tx));
 748    s->tx.status = le16_to_cpu(s->tx.status);
 749    s->tx.command = le16_to_cpu(s->tx.command);
 750    s->tx.link = le32_to_cpu(s->tx.link);
 751    s->tx.tbd_array_addr = le32_to_cpu(s->tx.tbd_array_addr);
 752    s->tx.tcb_bytes = le16_to_cpu(s->tx.tcb_bytes);
 753}
 754
 755static void tx_command(EEPRO100State *s)
 756{
 757    uint32_t tbd_array = le32_to_cpu(s->tx.tbd_array_addr);
 758    uint16_t tcb_bytes = (le16_to_cpu(s->tx.tcb_bytes) & 0x3fff);
 759    /* Sends larger than MAX_ETH_FRAME_SIZE are allowed, up to 2600 bytes. */
 760    uint8_t buf[2600];
 761    uint16_t size = 0;
 762    uint32_t tbd_address = s->cb_address + 0x10;
 763    TRACE(RXTX, logout
 764        ("transmit, TBD array address 0x%08x, TCB byte count 0x%04x, TBD count %u\n",
 765         tbd_array, tcb_bytes, s->tx.tbd_count));
 766
 767    if (tcb_bytes > 2600) {
 768        logout("TCB byte count too large, using 2600\n");
 769        tcb_bytes = 2600;
 770    }
 771    if (!((tcb_bytes > 0) || (tbd_array != 0xffffffff))) {
 772        logout
 773            ("illegal values of TBD array address and TCB byte count!\n");
 774    }
 775    assert(tcb_bytes <= sizeof(buf));
 776    while (size < tcb_bytes) {
 777        uint32_t tx_buffer_address = ldl_le_pci_dma(&s->dev, tbd_address);
 778        uint16_t tx_buffer_size = lduw_le_pci_dma(&s->dev, tbd_address + 4);
 779#if 0
 780        uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev, tbd_address + 6);
 781#endif
 782        if (tx_buffer_size == 0) {
 783            /* Prevent an endless loop. */
 784            logout("loop in %s:%u\n", __FILE__, __LINE__);
 785            break;
 786        }
 787        tbd_address += 8;
 788        TRACE(RXTX, logout
 789            ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
 790             tx_buffer_address, tx_buffer_size));
 791        tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
 792        pci_dma_read(&s->dev, tx_buffer_address, &buf[size], tx_buffer_size);
 793        size += tx_buffer_size;
 794    }
 795    if (tbd_array == 0xffffffff) {
 796        /* Simplified mode. Was already handled by code above. */
 797    } else {
 798        /* Flexible mode. */
 799        uint8_t tbd_count = 0;
 800        if (s->has_extended_tcb_support && !(s->configuration[6] & BIT(4))) {
 801            /* Extended Flexible TCB. */
 802            for (; tbd_count < 2; tbd_count++) {
 803                uint32_t tx_buffer_address = ldl_le_pci_dma(&s->dev,
 804                                                            tbd_address);
 805                uint16_t tx_buffer_size = lduw_le_pci_dma(&s->dev,
 806                                                          tbd_address + 4);
 807                uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev,
 808                                                        tbd_address + 6);
 809                tbd_address += 8;
 810                TRACE(RXTX, logout
 811                    ("TBD (extended flexible mode): buffer address 0x%08x, size 0x%04x\n",
 812                     tx_buffer_address, tx_buffer_size));
 813                tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
 814                pci_dma_read(&s->dev, tx_buffer_address,
 815                             &buf[size], tx_buffer_size);
 816                size += tx_buffer_size;
 817                if (tx_buffer_el & 1) {
 818                    break;
 819                }
 820            }
 821        }
 822        tbd_address = tbd_array;
 823        for (; tbd_count < s->tx.tbd_count; tbd_count++) {
 824            uint32_t tx_buffer_address = ldl_le_pci_dma(&s->dev, tbd_address);
 825            uint16_t tx_buffer_size = lduw_le_pci_dma(&s->dev, tbd_address + 4);
 826            uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev, tbd_address + 6);
 827            tbd_address += 8;
 828            TRACE(RXTX, logout
 829                ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
 830                 tx_buffer_address, tx_buffer_size));
 831            tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
 832            pci_dma_read(&s->dev, tx_buffer_address,
 833                         &buf[size], tx_buffer_size);
 834            size += tx_buffer_size;
 835            if (tx_buffer_el & 1) {
 836                break;
 837            }
 838        }
 839    }
 840    TRACE(RXTX, logout("%p sending frame, len=%d,%s\n", s, size, nic_dump(buf, size)));
 841    qemu_send_packet(qemu_get_queue(s->nic), buf, size);
 842    s->statistics.tx_good_frames++;
 843    /* Transmit with bad status would raise an CX/TNO interrupt.
 844     * (82557 only). Emulation never has bad status. */
 845#if 0
 846    eepro100_cx_interrupt(s);
 847#endif
 848}
 849
 850static void set_multicast_list(EEPRO100State *s)
 851{
 852    uint16_t multicast_count = s->tx.tbd_array_addr & BITS(13, 0);
 853    uint16_t i;
 854    memset(&s->mult[0], 0, sizeof(s->mult));
 855    TRACE(OTHER, logout("multicast list, multicast count = %u\n", multicast_count));
 856    for (i = 0; i < multicast_count; i += 6) {
 857        uint8_t multicast_addr[6];
 858        pci_dma_read(&s->dev, s->cb_address + 10 + i, multicast_addr, 6);
 859        TRACE(OTHER, logout("multicast entry %s\n", nic_dump(multicast_addr, 6)));
 860        unsigned mcast_idx = e100_compute_mcast_idx(multicast_addr);
 861        assert(mcast_idx < 64);
 862        s->mult[mcast_idx >> 3] |= (1 << (mcast_idx & 7));
 863    }
 864}
 865
 866static void action_command(EEPRO100State *s)
 867{
 868    /* The loop below won't stop if it gets special handcrafted data.
 869       Therefore we limit the number of iterations. */
 870    unsigned max_loop_count = 16;
 871
 872    for (;;) {
 873        bool bit_el;
 874        bool bit_s;
 875        bool bit_i;
 876        bool bit_nc;
 877        uint16_t ok_status = STATUS_OK;
 878        s->cb_address = s->cu_base + s->cu_offset;
 879        read_cb(s);
 880        bit_el = ((s->tx.command & COMMAND_EL) != 0);
 881        bit_s = ((s->tx.command & COMMAND_S) != 0);
 882        bit_i = ((s->tx.command & COMMAND_I) != 0);
 883        bit_nc = ((s->tx.command & COMMAND_NC) != 0);
 884#if 0
 885        bool bit_sf = ((s->tx.command & COMMAND_SF) != 0);
 886#endif
 887
 888        if (max_loop_count-- == 0) {
 889            /* Prevent an endless loop. */
 890            logout("loop in %s:%u\n", __FILE__, __LINE__);
 891            break;
 892        }
 893
 894        s->cu_offset = s->tx.link;
 895        TRACE(OTHER,
 896              logout("val=(cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
 897                     s->tx.status, s->tx.command, s->tx.link));
 898        switch (s->tx.command & COMMAND_CMD) {
 899        case CmdNOp:
 900            /* Do nothing. */
 901            break;
 902        case CmdIASetup:
 903            pci_dma_read(&s->dev, s->cb_address + 8, &s->conf.macaddr.a[0], 6);
 904            TRACE(OTHER, logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6)));
 905            break;
 906        case CmdConfigure:
 907            pci_dma_read(&s->dev, s->cb_address + 8,
 908                         &s->configuration[0], sizeof(s->configuration));
 909            TRACE(OTHER, logout("configuration: %s\n",
 910                                nic_dump(&s->configuration[0], 16)));
 911            TRACE(OTHER, logout("configuration: %s\n",
 912                                nic_dump(&s->configuration[16],
 913                                ARRAY_SIZE(s->configuration) - 16)));
 914            if (s->configuration[20] & BIT(6)) {
 915                TRACE(OTHER, logout("Multiple IA bit\n"));
 916            }
 917            break;
 918        case CmdMulticastList:
 919            set_multicast_list(s);
 920            break;
 921        case CmdTx:
 922            if (bit_nc) {
 923                missing("CmdTx: NC = 0");
 924                ok_status = 0;
 925                break;
 926            }
 927            tx_command(s);
 928            break;
 929        case CmdTDR:
 930            TRACE(OTHER, logout("load microcode\n"));
 931            /* Starting with offset 8, the command contains
 932             * 64 dwords microcode which we just ignore here. */
 933            break;
 934        case CmdDiagnose:
 935            TRACE(OTHER, logout("diagnose\n"));
 936            /* Make sure error flag is not set. */
 937            s->tx.status = 0;
 938            break;
 939        default:
 940            missing("undefined command");
 941            ok_status = 0;
 942            break;
 943        }
 944        /* Write new status. */
 945        stw_le_pci_dma(&s->dev, s->cb_address,
 946                       s->tx.status | ok_status | STATUS_C);
 947        if (bit_i) {
 948            /* CU completed action. */
 949            eepro100_cx_interrupt(s);
 950        }
 951        if (bit_el) {
 952            /* CU becomes idle. Terminate command loop. */
 953            set_cu_state(s, cu_idle);
 954            eepro100_cna_interrupt(s);
 955            break;
 956        } else if (bit_s) {
 957            /* CU becomes suspended. Terminate command loop. */
 958            set_cu_state(s, cu_suspended);
 959            eepro100_cna_interrupt(s);
 960            break;
 961        } else {
 962            /* More entries in list. */
 963            TRACE(OTHER, logout("CU list with at least one more entry\n"));
 964        }
 965    }
 966    TRACE(OTHER, logout("CU list empty\n"));
 967    /* List is empty. Now CU is idle or suspended. */
 968}
 969
 970static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
 971{
 972    cu_state_t cu_state;
 973    switch (val) {
 974    case CU_NOP:
 975        /* No operation. */
 976        break;
 977    case CU_START:
 978        cu_state = get_cu_state(s);
 979        if (cu_state != cu_idle && cu_state != cu_suspended) {
 980            /* Intel documentation says that CU must be idle or suspended
 981             * for the CU start command. */
 982            logout("unexpected CU state is %u\n", cu_state);
 983        }
 984        set_cu_state(s, cu_active);
 985        s->cu_offset = e100_read_reg4(s, SCBPointer);
 986        action_command(s);
 987        break;
 988    case CU_RESUME:
 989        if (get_cu_state(s) != cu_suspended) {
 990            logout("bad CU resume from CU state %u\n", get_cu_state(s));
 991            /* Workaround for bad Linux eepro100 driver which resumes
 992             * from idle state. */
 993#if 0
 994            missing("cu resume");
 995#endif
 996            set_cu_state(s, cu_suspended);
 997        }
 998        if (get_cu_state(s) == cu_suspended) {
 999            TRACE(OTHER, logout("CU resuming\n"));
1000            set_cu_state(s, cu_active);
1001            action_command(s);
1002        }
1003        break;
1004    case CU_STATSADDR:
1005        /* Load dump counters address. */
1006        s->statsaddr = e100_read_reg4(s, SCBPointer);
1007        TRACE(OTHER, logout("val=0x%02x (dump counters address)\n", val));
1008        if (s->statsaddr & 3) {
1009            /* Memory must be Dword aligned. */
1010            logout("unaligned dump counters address\n");
1011            /* Handling of misaligned addresses is undefined.
1012             * Here we align the address by ignoring the lower bits. */
1013            /* TODO: Test unaligned dump counter address on real hardware. */
1014            s->statsaddr &= ~3;
1015        }
1016        break;
1017    case CU_SHOWSTATS:
1018        /* Dump statistical counters. */
1019        TRACE(OTHER, logout("val=0x%02x (dump stats)\n", val));
1020        dump_statistics(s);
1021        stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa005);
1022        break;
1023    case CU_CMD_BASE:
1024        /* Load CU base. */
1025        TRACE(OTHER, logout("val=0x%02x (CU base address)\n", val));
1026        s->cu_base = e100_read_reg4(s, SCBPointer);
1027        break;
1028    case CU_DUMPSTATS:
1029        /* Dump and reset statistical counters. */
1030        TRACE(OTHER, logout("val=0x%02x (dump stats and reset)\n", val));
1031        dump_statistics(s);
1032        stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa007);
1033        memset(&s->statistics, 0, sizeof(s->statistics));
1034        break;
1035    case CU_SRESUME:
1036        /* CU static resume. */
1037        missing("CU static resume");
1038        break;
1039    default:
1040        missing("Undefined CU command");
1041    }
1042}
1043
1044static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
1045{
1046    switch (val) {
1047    case RU_NOP:
1048        /* No operation. */
1049        break;
1050    case RX_START:
1051        /* RU start. */
1052        if (get_ru_state(s) != ru_idle) {
1053            logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
1054#if 0
1055            assert(!"wrong RU state");
1056#endif
1057        }
1058        set_ru_state(s, ru_ready);
1059        s->ru_offset = e100_read_reg4(s, SCBPointer);
1060        qemu_flush_queued_packets(qemu_get_queue(s->nic));
1061        TRACE(OTHER, logout("val=0x%02x (rx start)\n", val));
1062        break;
1063    case RX_RESUME:
1064        /* Restart RU. */
1065        if (get_ru_state(s) != ru_suspended) {
1066            logout("RU state is %u, should be %u\n", get_ru_state(s),
1067                   ru_suspended);
1068#if 0
1069            assert(!"wrong RU state");
1070#endif
1071        }
1072        set_ru_state(s, ru_ready);
1073        break;
1074    case RU_ABORT:
1075        /* RU abort. */
1076        if (get_ru_state(s) == ru_ready) {
1077            eepro100_rnr_interrupt(s);
1078        }
1079        set_ru_state(s, ru_idle);
1080        break;
1081    case RX_ADDR_LOAD:
1082        /* Load RU base. */
1083        TRACE(OTHER, logout("val=0x%02x (RU base address)\n", val));
1084        s->ru_base = e100_read_reg4(s, SCBPointer);
1085        break;
1086    default:
1087        logout("val=0x%02x (undefined RU command)\n", val);
1088        missing("Undefined SU command");
1089    }
1090}
1091
1092static void eepro100_write_command(EEPRO100State * s, uint8_t val)
1093{
1094    eepro100_ru_command(s, val & 0x0f);
1095    eepro100_cu_command(s, val & 0xf0);
1096    if ((val) == 0) {
1097        TRACE(OTHER, logout("val=0x%02x\n", val));
1098    }
1099    /* Clear command byte after command was accepted. */
1100    s->mem[SCBCmd] = 0;
1101}
1102
1103/*****************************************************************************
1104 *
1105 * EEPROM emulation.
1106 *
1107 ****************************************************************************/
1108
1109#define EEPROM_CS       0x02
1110#define EEPROM_SK       0x01
1111#define EEPROM_DI       0x04
1112#define EEPROM_DO       0x08
1113
1114static uint16_t eepro100_read_eeprom(EEPRO100State * s)
1115{
1116    uint16_t val = e100_read_reg2(s, SCBeeprom);
1117    if (eeprom93xx_read(s->eeprom)) {
1118        val |= EEPROM_DO;
1119    } else {
1120        val &= ~EEPROM_DO;
1121    }
1122    TRACE(EEPROM, logout("val=0x%04x\n", val));
1123    return val;
1124}
1125
1126static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
1127{
1128    TRACE(EEPROM, logout("val=0x%02x\n", val));
1129
1130    /* mask unwritable bits */
1131#if 0
1132    val = SET_MASKED(val, 0x31, eeprom->value);
1133#endif
1134
1135    int eecs = ((val & EEPROM_CS) != 0);
1136    int eesk = ((val & EEPROM_SK) != 0);
1137    int eedi = ((val & EEPROM_DI) != 0);
1138    eeprom93xx_write(eeprom, eecs, eesk, eedi);
1139}
1140
1141/*****************************************************************************
1142 *
1143 * MDI emulation.
1144 *
1145 ****************************************************************************/
1146
1147#if defined(DEBUG_EEPRO100)
1148static const char * const mdi_op_name[] = {
1149    "opcode 0",
1150    "write",
1151    "read",
1152    "opcode 3"
1153};
1154
1155static const char * const mdi_reg_name[] = {
1156    "Control",
1157    "Status",
1158    "PHY Identification (Word 1)",
1159    "PHY Identification (Word 2)",
1160    "Auto-Negotiation Advertisement",
1161    "Auto-Negotiation Link Partner Ability",
1162    "Auto-Negotiation Expansion"
1163};
1164
1165static const char *reg2name(uint8_t reg)
1166{
1167    static char buffer[10];
1168    const char *p = buffer;
1169    if (reg < ARRAY_SIZE(mdi_reg_name)) {
1170        p = mdi_reg_name[reg];
1171    } else {
1172        snprintf(buffer, sizeof(buffer), "reg=0x%02x", reg);
1173    }
1174    return p;
1175}
1176#endif                          /* DEBUG_EEPRO100 */
1177
1178static uint32_t eepro100_read_mdi(EEPRO100State * s)
1179{
1180    uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
1181
1182#ifdef DEBUG_EEPRO100
1183    uint8_t raiseint = (val & BIT(29)) >> 29;
1184    uint8_t opcode = (val & BITS(27, 26)) >> 26;
1185    uint8_t phy = (val & BITS(25, 21)) >> 21;
1186    uint8_t reg = (val & BITS(20, 16)) >> 16;
1187    uint16_t data = (val & BITS(15, 0));
1188#endif
1189    /* Emulation takes no time to finish MDI transaction. */
1190    val |= BIT(28);
1191    TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1192                      val, raiseint, mdi_op_name[opcode], phy,
1193                      reg2name(reg), data));
1194    return val;
1195}
1196
1197static void eepro100_write_mdi(EEPRO100State *s)
1198{
1199    uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
1200    uint8_t raiseint = (val & BIT(29)) >> 29;
1201    uint8_t opcode = (val & BITS(27, 26)) >> 26;
1202    uint8_t phy = (val & BITS(25, 21)) >> 21;
1203    uint8_t reg = (val & BITS(20, 16)) >> 16;
1204    uint16_t data = (val & BITS(15, 0));
1205    TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1206          val, raiseint, mdi_op_name[opcode], phy, reg2name(reg), data));
1207    if (phy != 1) {
1208        /* Unsupported PHY address. */
1209#if 0
1210        logout("phy must be 1 but is %u\n", phy);
1211#endif
1212        data = 0;
1213    } else if (opcode != 1 && opcode != 2) {
1214        /* Unsupported opcode. */
1215        logout("opcode must be 1 or 2 but is %u\n", opcode);
1216        data = 0;
1217    } else if (reg > 6) {
1218        /* Unsupported register. */
1219        logout("register must be 0...6 but is %u\n", reg);
1220        data = 0;
1221    } else {
1222        TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
1223                          val, raiseint, mdi_op_name[opcode], phy,
1224                          reg2name(reg), data));
1225        if (opcode == 1) {
1226            /* MDI write */
1227            switch (reg) {
1228            case 0:            /* Control Register */
1229                if (data & 0x8000) {
1230                    /* Reset status and control registers to default. */
1231                    s->mdimem[0] = eepro100_mdi_default[0];
1232                    s->mdimem[1] = eepro100_mdi_default[1];
1233                    data = s->mdimem[reg];
1234                } else {
1235                    /* Restart Auto Configuration = Normal Operation */
1236                    data &= ~0x0200;
1237                }
1238                break;
1239            case 1:            /* Status Register */
1240                missing("not writable");
1241                break;
1242            case 2:            /* PHY Identification Register (Word 1) */
1243            case 3:            /* PHY Identification Register (Word 2) */
1244                missing("not implemented");
1245                break;
1246            case 4:            /* Auto-Negotiation Advertisement Register */
1247            case 5:            /* Auto-Negotiation Link Partner Ability Register */
1248                break;
1249            case 6:            /* Auto-Negotiation Expansion Register */
1250            default:
1251                missing("not implemented");
1252            }
1253            s->mdimem[reg] &= eepro100_mdi_mask[reg];
1254            s->mdimem[reg] |= data & ~eepro100_mdi_mask[reg];
1255        } else if (opcode == 2) {
1256            /* MDI read */
1257            switch (reg) {
1258            case 0:            /* Control Register */
1259                if (data & 0x8000) {
1260                    /* Reset status and control registers to default. */
1261                    s->mdimem[0] = eepro100_mdi_default[0];
1262                    s->mdimem[1] = eepro100_mdi_default[1];
1263                }
1264                break;
1265            case 1:            /* Status Register */
1266                s->mdimem[reg] |= 0x0020;
1267                break;
1268            case 2:            /* PHY Identification Register (Word 1) */
1269            case 3:            /* PHY Identification Register (Word 2) */
1270            case 4:            /* Auto-Negotiation Advertisement Register */
1271                break;
1272            case 5:            /* Auto-Negotiation Link Partner Ability Register */
1273                s->mdimem[reg] = 0x41fe;
1274                break;
1275            case 6:            /* Auto-Negotiation Expansion Register */
1276                s->mdimem[reg] = 0x0001;
1277                break;
1278            }
1279            data = s->mdimem[reg];
1280        }
1281        /* Emulation takes no time to finish MDI transaction.
1282         * Set MDI bit in SCB status register. */
1283        s->mem[SCBAck] |= 0x08;
1284        val |= BIT(28);
1285        if (raiseint) {
1286            eepro100_mdi_interrupt(s);
1287        }
1288    }
1289    val = (val & 0xffff0000) + data;
1290    e100_write_reg4(s, SCBCtrlMDI, val);
1291}
1292
1293/*****************************************************************************
1294 *
1295 * Port emulation.
1296 *
1297 ****************************************************************************/
1298
1299#define PORT_SOFTWARE_RESET     0
1300#define PORT_SELFTEST           1
1301#define PORT_SELECTIVE_RESET    2
1302#define PORT_DUMP               3
1303#define PORT_SELECTION_MASK     3
1304
1305typedef struct {
1306    uint32_t st_sign;           /* Self Test Signature */
1307    uint32_t st_result;         /* Self Test Results */
1308} eepro100_selftest_t;
1309
1310static uint32_t eepro100_read_port(EEPRO100State * s)
1311{
1312    return 0;
1313}
1314
1315static void eepro100_write_port(EEPRO100State *s)
1316{
1317    uint32_t val = e100_read_reg4(s, SCBPort);
1318    uint32_t address = (val & ~PORT_SELECTION_MASK);
1319    uint8_t selection = (val & PORT_SELECTION_MASK);
1320    switch (selection) {
1321    case PORT_SOFTWARE_RESET:
1322        nic_reset(s);
1323        break;
1324    case PORT_SELFTEST:
1325        TRACE(OTHER, logout("selftest address=0x%08x\n", address));
1326        eepro100_selftest_t data;
1327        pci_dma_read(&s->dev, address, (uint8_t *) &data, sizeof(data));
1328        data.st_sign = 0xffffffff;
1329        data.st_result = 0;
1330        pci_dma_write(&s->dev, address, (uint8_t *) &data, sizeof(data));
1331        break;
1332    case PORT_SELECTIVE_RESET:
1333        TRACE(OTHER, logout("selective reset, selftest address=0x%08x\n", address));
1334        nic_selective_reset(s);
1335        break;
1336    default:
1337        logout("val=0x%08x\n", val);
1338        missing("unknown port selection");
1339    }
1340}
1341
1342/*****************************************************************************
1343 *
1344 * General hardware emulation.
1345 *
1346 ****************************************************************************/
1347
1348static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
1349{
1350    uint8_t val = 0;
1351    if (addr <= sizeof(s->mem) - sizeof(val)) {
1352        val = s->mem[addr];
1353    }
1354
1355    switch (addr) {
1356    case SCBStatus:
1357    case SCBAck:
1358        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1359        break;
1360    case SCBCmd:
1361        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1362#if 0
1363        val = eepro100_read_command(s);
1364#endif
1365        break;
1366    case SCBIntmask:
1367        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1368        break;
1369    case SCBPort + 3:
1370        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1371        break;
1372    case SCBeeprom:
1373        val = eepro100_read_eeprom(s);
1374        break;
1375    case SCBCtrlMDI:
1376    case SCBCtrlMDI + 1:
1377    case SCBCtrlMDI + 2:
1378    case SCBCtrlMDI + 3:
1379        val = (uint8_t)(eepro100_read_mdi(s) >> (8 * (addr & 3)));
1380        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1381        break;
1382    case SCBpmdr:       /* Power Management Driver Register */
1383        val = 0;
1384        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1385        break;
1386    case SCBgctrl:      /* General Control Register */
1387        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1388        break;
1389    case SCBgstat:      /* General Status Register */
1390        /* 100 Mbps full duplex, valid link */
1391        val = 0x07;
1392        TRACE(OTHER, logout("addr=General Status val=%02x\n", val));
1393        break;
1394    default:
1395        logout("addr=%s val=0x%02x\n", regname(addr), val);
1396        missing("unknown byte read");
1397    }
1398    return val;
1399}
1400
1401static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
1402{
1403    uint16_t val = 0;
1404    if (addr <= sizeof(s->mem) - sizeof(val)) {
1405        val = e100_read_reg2(s, addr);
1406    }
1407
1408    switch (addr) {
1409    case SCBStatus:
1410    case SCBCmd:
1411        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1412        break;
1413    case SCBeeprom:
1414        val = eepro100_read_eeprom(s);
1415        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1416        break;
1417    case SCBCtrlMDI:
1418    case SCBCtrlMDI + 2:
1419        val = (uint16_t)(eepro100_read_mdi(s) >> (8 * (addr & 3)));
1420        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1421        break;
1422    default:
1423        logout("addr=%s val=0x%04x\n", regname(addr), val);
1424        missing("unknown word read");
1425    }
1426    return val;
1427}
1428
1429static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
1430{
1431    uint32_t val = 0;
1432    if (addr <= sizeof(s->mem) - sizeof(val)) {
1433        val = e100_read_reg4(s, addr);
1434    }
1435
1436    switch (addr) {
1437    case SCBStatus:
1438        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1439        break;
1440    case SCBPointer:
1441        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1442        break;
1443    case SCBPort:
1444        val = eepro100_read_port(s);
1445        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1446        break;
1447    case SCBflash:
1448        val = eepro100_read_eeprom(s);
1449        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1450        break;
1451    case SCBCtrlMDI:
1452        val = eepro100_read_mdi(s);
1453        break;
1454    default:
1455        logout("addr=%s val=0x%08x\n", regname(addr), val);
1456        missing("unknown longword read");
1457    }
1458    return val;
1459}
1460
1461static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
1462{
1463    /* SCBStatus is readonly. */
1464    if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
1465        s->mem[addr] = val;
1466    }
1467
1468    switch (addr) {
1469    case SCBStatus:
1470        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1471        break;
1472    case SCBAck:
1473        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1474        eepro100_acknowledge(s);
1475        break;
1476    case SCBCmd:
1477        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1478        eepro100_write_command(s, val);
1479        break;
1480    case SCBIntmask:
1481        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1482        if (val & BIT(1)) {
1483            eepro100_swi_interrupt(s);
1484        }
1485        eepro100_interrupt(s, 0);
1486        break;
1487    case SCBPointer:
1488    case SCBPointer + 1:
1489    case SCBPointer + 2:
1490    case SCBPointer + 3:
1491        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1492        break;
1493    case SCBPort:
1494    case SCBPort + 1:
1495    case SCBPort + 2:
1496        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1497        break;
1498    case SCBPort + 3:
1499        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1500        eepro100_write_port(s);
1501        break;
1502    case SCBFlow:       /* does not exist on 82557 */
1503    case SCBFlow + 1:
1504    case SCBFlow + 2:
1505    case SCBpmdr:       /* does not exist on 82557 */
1506        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1507        break;
1508    case SCBeeprom:
1509        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1510        eepro100_write_eeprom(s->eeprom, val);
1511        break;
1512    case SCBCtrlMDI:
1513    case SCBCtrlMDI + 1:
1514    case SCBCtrlMDI + 2:
1515        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1516        break;
1517    case SCBCtrlMDI + 3:
1518        TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
1519        eepro100_write_mdi(s);
1520        break;
1521    default:
1522        logout("addr=%s val=0x%02x\n", regname(addr), val);
1523        missing("unknown byte write");
1524    }
1525}
1526
1527static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
1528{
1529    /* SCBStatus is readonly. */
1530    if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
1531        e100_write_reg2(s, addr, val);
1532    }
1533
1534    switch (addr) {
1535    case SCBStatus:
1536        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1537        s->mem[SCBAck] = (val >> 8);
1538        eepro100_acknowledge(s);
1539        break;
1540    case SCBCmd:
1541        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1542        eepro100_write_command(s, val);
1543        eepro100_write1(s, SCBIntmask, val >> 8);
1544        break;
1545    case SCBPointer:
1546    case SCBPointer + 2:
1547        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1548        break;
1549    case SCBPort:
1550        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1551        break;
1552    case SCBPort + 2:
1553        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1554        eepro100_write_port(s);
1555        break;
1556    case SCBeeprom:
1557        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1558        eepro100_write_eeprom(s->eeprom, val);
1559        break;
1560    case SCBCtrlMDI:
1561        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1562        break;
1563    case SCBCtrlMDI + 2:
1564        TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
1565        eepro100_write_mdi(s);
1566        break;
1567    default:
1568        logout("addr=%s val=0x%04x\n", regname(addr), val);
1569        missing("unknown word write");
1570    }
1571}
1572
1573static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
1574{
1575    if (addr <= sizeof(s->mem) - sizeof(val)) {
1576        e100_write_reg4(s, addr, val);
1577    }
1578
1579    switch (addr) {
1580    case SCBPointer:
1581        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1582        break;
1583    case SCBPort:
1584        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1585        eepro100_write_port(s);
1586        break;
1587    case SCBflash:
1588        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1589        val = val >> 16;
1590        eepro100_write_eeprom(s->eeprom, val);
1591        break;
1592    case SCBCtrlMDI:
1593        TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
1594        eepro100_write_mdi(s);
1595        break;
1596    default:
1597        logout("addr=%s val=0x%08x\n", regname(addr), val);
1598        missing("unknown longword write");
1599    }
1600}
1601
1602static uint64_t eepro100_read(void *opaque, hwaddr addr,
1603                              unsigned size)
1604{
1605    EEPRO100State *s = opaque;
1606
1607    switch (size) {
1608    case 1: return eepro100_read1(s, addr);
1609    case 2: return eepro100_read2(s, addr);
1610    case 4: return eepro100_read4(s, addr);
1611    default: abort();
1612    }
1613}
1614
1615static void eepro100_write(void *opaque, hwaddr addr,
1616                           uint64_t data, unsigned size)
1617{
1618    EEPRO100State *s = opaque;
1619
1620    switch (size) {
1621    case 1:
1622        eepro100_write1(s, addr, data);
1623        break;
1624    case 2:
1625        eepro100_write2(s, addr, data);
1626        break;
1627    case 4:
1628        eepro100_write4(s, addr, data);
1629        break;
1630    default:
1631        abort();
1632    }
1633}
1634
1635static const MemoryRegionOps eepro100_ops = {
1636    .read = eepro100_read,
1637    .write = eepro100_write,
1638    .endianness = DEVICE_LITTLE_ENDIAN,
1639};
1640
1641static ssize_t nic_receive(NetClientState *nc, const uint8_t * buf, size_t size)
1642{
1643    /* TODO:
1644     * - Magic packets should set bit 30 in power management driver register.
1645     * - Interesting packets should set bit 29 in power management driver register.
1646     */
1647    EEPRO100State *s = qemu_get_nic_opaque(nc);
1648    uint16_t rfd_status = 0xa000;
1649#if defined(CONFIG_PAD_RECEIVED_FRAMES)
1650    uint8_t min_buf[60];
1651#endif
1652    static const uint8_t broadcast_macaddr[6] =
1653        { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1654
1655#if defined(CONFIG_PAD_RECEIVED_FRAMES)
1656    /* Pad to minimum Ethernet frame length */
1657    if (size < sizeof(min_buf)) {
1658        memcpy(min_buf, buf, size);
1659        memset(&min_buf[size], 0, sizeof(min_buf) - size);
1660        buf = min_buf;
1661        size = sizeof(min_buf);
1662    }
1663#endif
1664
1665    if (s->configuration[8] & 0x80) {
1666        /* CSMA is disabled. */
1667        logout("%p received while CSMA is disabled\n", s);
1668        return -1;
1669#if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1670    } else if (size < 64 && (s->configuration[7] & BIT(0))) {
1671        /* Short frame and configuration byte 7/0 (discard short receive) set:
1672         * Short frame is discarded */
1673        logout("%p received short frame (%zu byte)\n", s, size);
1674        s->statistics.rx_short_frame_errors++;
1675        return -1;
1676#endif
1677    } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & BIT(3))) {
1678        /* Long frame and configuration byte 18/3 (long receive ok) not set:
1679         * Long frames are discarded. */
1680        logout("%p received long frame (%zu byte), ignored\n", s, size);
1681        return -1;
1682    } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) {       /* !!! */
1683        /* Frame matches individual address. */
1684        /* TODO: check configuration byte 15/4 (ignore U/L). */
1685        TRACE(RXTX, logout("%p received frame for me, len=%zu\n", s, size));
1686    } else if (memcmp(buf, broadcast_macaddr, 6) == 0) {
1687        /* Broadcast frame. */
1688        TRACE(RXTX, logout("%p received broadcast, len=%zu\n", s, size));
1689        rfd_status |= 0x0002;
1690    } else if (buf[0] & 0x01) {
1691        /* Multicast frame. */
1692        TRACE(RXTX, logout("%p received multicast, len=%zu,%s\n", s, size, nic_dump(buf, size)));
1693        if (s->configuration[21] & BIT(3)) {
1694          /* Multicast all bit is set, receive all multicast frames. */
1695        } else {
1696          unsigned mcast_idx = e100_compute_mcast_idx(buf);
1697          assert(mcast_idx < 64);
1698          if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
1699            /* Multicast frame is allowed in hash table. */
1700          } else if (s->configuration[15] & BIT(0)) {
1701              /* Promiscuous: receive all. */
1702              rfd_status |= 0x0004;
1703          } else {
1704              TRACE(RXTX, logout("%p multicast ignored\n", s));
1705              return -1;
1706          }
1707        }
1708        /* TODO: Next not for promiscuous mode? */
1709        rfd_status |= 0x0002;
1710    } else if (s->configuration[15] & BIT(0)) {
1711        /* Promiscuous: receive all. */
1712        TRACE(RXTX, logout("%p received frame in promiscuous mode, len=%zu\n", s, size));
1713        rfd_status |= 0x0004;
1714    } else if (s->configuration[20] & BIT(6)) {
1715        /* Multiple IA bit set. */
1716        unsigned mcast_idx = compute_mcast_idx(buf);
1717        assert(mcast_idx < 64);
1718        if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
1719            TRACE(RXTX, logout("%p accepted, multiple IA bit set\n", s));
1720        } else {
1721            TRACE(RXTX, logout("%p frame ignored, multiple IA bit set\n", s));
1722            return -1;
1723        }
1724    } else {
1725        TRACE(RXTX, logout("%p received frame, ignored, len=%zu,%s\n", s, size,
1726              nic_dump(buf, size)));
1727        return size;
1728    }
1729
1730    if (get_ru_state(s) != ru_ready) {
1731        /* No resources available. */
1732        logout("no resources, state=%u\n", get_ru_state(s));
1733        /* TODO: RNR interrupt only at first failed frame? */
1734        eepro100_rnr_interrupt(s);
1735        s->statistics.rx_resource_errors++;
1736#if 0
1737        assert(!"no resources");
1738#endif
1739        return -1;
1740    }
1741    /* !!! */
1742    eepro100_rx_t rx;
1743    pci_dma_read(&s->dev, s->ru_base + s->ru_offset,
1744                 &rx, sizeof(eepro100_rx_t));
1745    uint16_t rfd_command = le16_to_cpu(rx.command);
1746    uint16_t rfd_size = le16_to_cpu(rx.size);
1747
1748    if (size > rfd_size) {
1749        logout("Receive buffer (%" PRId16 " bytes) too small for data "
1750            "(%zu bytes); data truncated\n", rfd_size, size);
1751        size = rfd_size;
1752    }
1753#if !defined(CONFIG_PAD_RECEIVED_FRAMES)
1754    if (size < 64) {
1755        rfd_status |= 0x0080;
1756    }
1757#endif
1758    TRACE(OTHER, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n",
1759          rfd_command, rx.link, rx.rx_buf_addr, rfd_size));
1760    stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset +
1761                offsetof(eepro100_rx_t, status), rfd_status);
1762    stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset +
1763                offsetof(eepro100_rx_t, count), size);
1764    /* Early receive interrupt not supported. */
1765#if 0
1766    eepro100_er_interrupt(s);
1767#endif
1768    /* Receive CRC Transfer not supported. */
1769    if (s->configuration[18] & BIT(2)) {
1770        missing("Receive CRC Transfer");
1771        return -1;
1772    }
1773    /* TODO: check stripping enable bit. */
1774#if 0
1775    assert(!(s->configuration[17] & BIT(0)));
1776#endif
1777    pci_dma_write(&s->dev, s->ru_base + s->ru_offset +
1778                  sizeof(eepro100_rx_t), buf, size);
1779    s->statistics.rx_good_frames++;
1780    eepro100_fr_interrupt(s);
1781    s->ru_offset = le32_to_cpu(rx.link);
1782    if (rfd_command & COMMAND_EL) {
1783        /* EL bit is set, so this was the last frame. */
1784        logout("receive: Running out of frames\n");
1785        set_ru_state(s, ru_no_resources);
1786        eepro100_rnr_interrupt(s);
1787    }
1788    if (rfd_command & COMMAND_S) {
1789        /* S bit is set. */
1790        set_ru_state(s, ru_suspended);
1791    }
1792    return size;
1793}
1794
1795static const VMStateDescription vmstate_eepro100 = {
1796    .version_id = 3,
1797    .minimum_version_id = 2,
1798    .fields = (VMStateField[]) {
1799        VMSTATE_PCI_DEVICE(dev, EEPRO100State),
1800        VMSTATE_UNUSED(32),
1801        VMSTATE_BUFFER(mult, EEPRO100State),
1802        VMSTATE_BUFFER(mem, EEPRO100State),
1803        /* Save all members of struct between scb_stat and mem. */
1804        VMSTATE_UINT8(scb_stat, EEPRO100State),
1805        VMSTATE_UINT8(int_stat, EEPRO100State),
1806        VMSTATE_UNUSED(3*4),
1807        VMSTATE_MACADDR(conf.macaddr, EEPRO100State),
1808        VMSTATE_UNUSED(19*4),
1809        VMSTATE_UINT16_ARRAY(mdimem, EEPRO100State, 32),
1810        /* The eeprom should be saved and restored by its own routines. */
1811        VMSTATE_UINT32(device, EEPRO100State),
1812        /* TODO check device. */
1813        VMSTATE_UINT32(cu_base, EEPRO100State),
1814        VMSTATE_UINT32(cu_offset, EEPRO100State),
1815        VMSTATE_UINT32(ru_base, EEPRO100State),
1816        VMSTATE_UINT32(ru_offset, EEPRO100State),
1817        VMSTATE_UINT32(statsaddr, EEPRO100State),
1818        /* Save eepro100_stats_t statistics. */
1819        VMSTATE_UINT32(statistics.tx_good_frames, EEPRO100State),
1820        VMSTATE_UINT32(statistics.tx_max_collisions, EEPRO100State),
1821        VMSTATE_UINT32(statistics.tx_late_collisions, EEPRO100State),
1822        VMSTATE_UINT32(statistics.tx_underruns, EEPRO100State),
1823        VMSTATE_UINT32(statistics.tx_lost_crs, EEPRO100State),
1824        VMSTATE_UINT32(statistics.tx_deferred, EEPRO100State),
1825        VMSTATE_UINT32(statistics.tx_single_collisions, EEPRO100State),
1826        VMSTATE_UINT32(statistics.tx_multiple_collisions, EEPRO100State),
1827        VMSTATE_UINT32(statistics.tx_total_collisions, EEPRO100State),
1828        VMSTATE_UINT32(statistics.rx_good_frames, EEPRO100State),
1829        VMSTATE_UINT32(statistics.rx_crc_errors, EEPRO100State),
1830        VMSTATE_UINT32(statistics.rx_alignment_errors, EEPRO100State),
1831        VMSTATE_UINT32(statistics.rx_resource_errors, EEPRO100State),
1832        VMSTATE_UINT32(statistics.rx_overrun_errors, EEPRO100State),
1833        VMSTATE_UINT32(statistics.rx_cdt_errors, EEPRO100State),
1834        VMSTATE_UINT32(statistics.rx_short_frame_errors, EEPRO100State),
1835        VMSTATE_UINT32(statistics.fc_xmt_pause, EEPRO100State),
1836        VMSTATE_UINT32(statistics.fc_rcv_pause, EEPRO100State),
1837        VMSTATE_UINT32(statistics.fc_rcv_unsupported, EEPRO100State),
1838        VMSTATE_UINT16(statistics.xmt_tco_frames, EEPRO100State),
1839        VMSTATE_UINT16(statistics.rcv_tco_frames, EEPRO100State),
1840        /* Configuration bytes. */
1841        VMSTATE_BUFFER(configuration, EEPRO100State),
1842        VMSTATE_END_OF_LIST()
1843    }
1844};
1845
1846static void pci_nic_uninit(PCIDevice *pci_dev)
1847{
1848    EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1849
1850    vmstate_unregister(&pci_dev->qdev, s->vmstate, s);
1851    g_free(s->vmstate);
1852    eeprom93xx_free(&pci_dev->qdev, s->eeprom);
1853    qemu_del_nic(s->nic);
1854}
1855
1856static NetClientInfo net_eepro100_info = {
1857    .type = NET_CLIENT_DRIVER_NIC,
1858    .size = sizeof(NICState),
1859    .receive = nic_receive,
1860};
1861
1862static void e100_nic_realize(PCIDevice *pci_dev, Error **errp)
1863{
1864    EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
1865    E100PCIDeviceInfo *info = eepro100_get_class(s);
1866    Error *local_err = NULL;
1867
1868    TRACE(OTHER, logout("\n"));
1869
1870    s->device = info->device;
1871
1872    e100_pci_reset(s, &local_err);
1873    if (local_err) {
1874        error_propagate(errp, local_err);
1875        return;
1876    }
1877
1878    /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
1879     * i82559 and later support 64 or 256 word EEPROM. */
1880    s->eeprom = eeprom93xx_new(&pci_dev->qdev, EEPROM_SIZE);
1881
1882    /* Handler for memory-mapped I/O */
1883    memory_region_init_io(&s->mmio_bar, OBJECT(s), &eepro100_ops, s,
1884                          "eepro100-mmio", PCI_MEM_SIZE);
1885    pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->mmio_bar);
1886    memory_region_init_io(&s->io_bar, OBJECT(s), &eepro100_ops, s,
1887                          "eepro100-io", PCI_IO_SIZE);
1888    pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->io_bar);
1889    /* FIXME: flash aliases to mmio?! */
1890    memory_region_init_io(&s->flash_bar, OBJECT(s), &eepro100_ops, s,
1891                          "eepro100-flash", PCI_FLASH_SIZE);
1892    pci_register_bar(&s->dev, 2, 0, &s->flash_bar);
1893
1894    qemu_macaddr_default_if_unset(&s->conf.macaddr);
1895    logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6));
1896
1897    nic_reset(s);
1898
1899    s->nic = qemu_new_nic(&net_eepro100_info, &s->conf,
1900                          object_get_typename(OBJECT(pci_dev)), pci_dev->qdev.id, s);
1901
1902    qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
1903    TRACE(OTHER, logout("%s\n", qemu_get_queue(s->nic)->info_str));
1904
1905    qemu_register_reset(nic_reset, s);
1906
1907    s->vmstate = g_malloc(sizeof(vmstate_eepro100));
1908    memcpy(s->vmstate, &vmstate_eepro100, sizeof(vmstate_eepro100));
1909    s->vmstate->name = qemu_get_queue(s->nic)->model;
1910    vmstate_register(&pci_dev->qdev, -1, s->vmstate, s);
1911}
1912
1913static void eepro100_instance_init(Object *obj)
1914{
1915    EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, PCI_DEVICE(obj));
1916    device_add_bootindex_property(obj, &s->conf.bootindex,
1917                                  "bootindex", "/ethernet-phy@0",
1918                                  DEVICE(s), NULL);
1919}
1920
1921static E100PCIDeviceInfo e100_devices[] = {
1922    {
1923        .name = "i82550",
1924        .desc = "Intel i82550 Ethernet",
1925        .device = i82550,
1926        /* TODO: check device id. */
1927        .device_id = PCI_DEVICE_ID_INTEL_82551IT,
1928        /* Revision ID: 0x0c, 0x0d, 0x0e. */
1929        .revision = 0x0e,
1930        /* TODO: check size of statistical counters. */
1931        .stats_size = 80,
1932        /* TODO: check extended tcb support. */
1933        .has_extended_tcb_support = true,
1934        .power_management = true,
1935    },{
1936        .name = "i82551",
1937        .desc = "Intel i82551 Ethernet",
1938        .device = i82551,
1939        .device_id = PCI_DEVICE_ID_INTEL_82551IT,
1940        /* Revision ID: 0x0f, 0x10. */
1941        .revision = 0x0f,
1942        /* TODO: check size of statistical counters. */
1943        .stats_size = 80,
1944        .has_extended_tcb_support = true,
1945        .power_management = true,
1946    },{
1947        .name = "i82557a",
1948        .desc = "Intel i82557A Ethernet",
1949        .device = i82557A,
1950        .device_id = PCI_DEVICE_ID_INTEL_82557,
1951        .revision = 0x01,
1952        .power_management = false,
1953    },{
1954        .name = "i82557b",
1955        .desc = "Intel i82557B Ethernet",
1956        .device = i82557B,
1957        .device_id = PCI_DEVICE_ID_INTEL_82557,
1958        .revision = 0x02,
1959        .power_management = false,
1960    },{
1961        .name = "i82557c",
1962        .desc = "Intel i82557C Ethernet",
1963        .device = i82557C,
1964        .device_id = PCI_DEVICE_ID_INTEL_82557,
1965        .revision = 0x03,
1966        .power_management = false,
1967    },{
1968        .name = "i82558a",
1969        .desc = "Intel i82558A Ethernet",
1970        .device = i82558A,
1971        .device_id = PCI_DEVICE_ID_INTEL_82557,
1972        .revision = 0x04,
1973        .stats_size = 76,
1974        .has_extended_tcb_support = true,
1975        .power_management = true,
1976    },{
1977        .name = "i82558b",
1978        .desc = "Intel i82558B Ethernet",
1979        .device = i82558B,
1980        .device_id = PCI_DEVICE_ID_INTEL_82557,
1981        .revision = 0x05,
1982        .stats_size = 76,
1983        .has_extended_tcb_support = true,
1984        .power_management = true,
1985    },{
1986        .name = "i82559a",
1987        .desc = "Intel i82559A Ethernet",
1988        .device = i82559A,
1989        .device_id = PCI_DEVICE_ID_INTEL_82557,
1990        .revision = 0x06,
1991        .stats_size = 80,
1992        .has_extended_tcb_support = true,
1993        .power_management = true,
1994    },{
1995        .name = "i82559b",
1996        .desc = "Intel i82559B Ethernet",
1997        .device = i82559B,
1998        .device_id = PCI_DEVICE_ID_INTEL_82557,
1999        .revision = 0x07,
2000        .stats_size = 80,
2001        .has_extended_tcb_support = true,
2002        .power_management = true,
2003    },{
2004        .name = "i82559c",
2005        .desc = "Intel i82559C Ethernet",
2006        .device = i82559C,
2007        .device_id = PCI_DEVICE_ID_INTEL_82557,
2008#if 0
2009        .revision = 0x08,
2010#endif
2011        /* TODO: Windows wants revision id 0x0c. */
2012        .revision = 0x0c,
2013#if EEPROM_SIZE > 0
2014        .subsystem_vendor_id = PCI_VENDOR_ID_INTEL,
2015        .subsystem_id = 0x0040,
2016#endif
2017        .stats_size = 80,
2018        .has_extended_tcb_support = true,
2019        .power_management = true,
2020    },{
2021        .name = "i82559er",
2022        .desc = "Intel i82559ER Ethernet",
2023        .device = i82559ER,
2024        .device_id = PCI_DEVICE_ID_INTEL_82551IT,
2025        .revision = 0x09,
2026        .stats_size = 80,
2027        .has_extended_tcb_support = true,
2028        .power_management = true,
2029    },{
2030        .name = "i82562",
2031        .desc = "Intel i82562 Ethernet",
2032        .device = i82562,
2033        /* TODO: check device id. */
2034        .device_id = PCI_DEVICE_ID_INTEL_82551IT,
2035        /* TODO: wrong revision id. */
2036        .revision = 0x0e,
2037        .stats_size = 80,
2038        .has_extended_tcb_support = true,
2039        .power_management = true,
2040    },{
2041        /* Toshiba Tecra 8200. */
2042        .name = "i82801",
2043        .desc = "Intel i82801 Ethernet",
2044        .device = i82801,
2045        .device_id = 0x2449,
2046        .revision = 0x03,
2047        .stats_size = 80,
2048        .has_extended_tcb_support = true,
2049        .power_management = true,
2050    }
2051};
2052
2053static E100PCIDeviceInfo *eepro100_get_class_by_name(const char *typename)
2054{
2055    E100PCIDeviceInfo *info = NULL;
2056    int i;
2057
2058    /* This is admittedly awkward but also temporary.  QOM allows for
2059     * parameterized typing and for subclassing both of which would suitable
2060     * handle what's going on here.  But class_data is already being used as
2061     * a stop-gap hack to allow incremental qdev conversion so we cannot use it
2062     * right now.  Once we merge the final QOM series, we can come back here and
2063     * do this in a much more elegant fashion.
2064     */
2065    for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
2066        if (strcmp(e100_devices[i].name, typename) == 0) {
2067            info = &e100_devices[i];
2068            break;
2069        }
2070    }
2071    assert(info != NULL);
2072
2073    return info;
2074}
2075
2076static E100PCIDeviceInfo *eepro100_get_class(EEPRO100State *s)
2077{
2078    return eepro100_get_class_by_name(object_get_typename(OBJECT(s)));
2079}
2080
2081static Property e100_properties[] = {
2082    DEFINE_NIC_PROPERTIES(EEPRO100State, conf),
2083    DEFINE_PROP_END_OF_LIST(),
2084};
2085
2086static void eepro100_class_init(ObjectClass *klass, void *data)
2087{
2088    DeviceClass *dc = DEVICE_CLASS(klass);
2089    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2090    E100PCIDeviceInfo *info;
2091
2092    info = eepro100_get_class_by_name(object_class_get_name(klass));
2093
2094    set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
2095    dc->props = e100_properties;
2096    dc->desc = info->desc;
2097    k->vendor_id = PCI_VENDOR_ID_INTEL;
2098    k->class_id = PCI_CLASS_NETWORK_ETHERNET;
2099    k->romfile = "pxe-eepro100.rom";
2100    k->realize = e100_nic_realize;
2101    k->exit = pci_nic_uninit;
2102    k->device_id = info->device_id;
2103    k->revision = info->revision;
2104    k->subsystem_vendor_id = info->subsystem_vendor_id;
2105    k->subsystem_id = info->subsystem_id;
2106}
2107
2108static void eepro100_register_types(void)
2109{
2110    size_t i;
2111    for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
2112        TypeInfo type_info = {};
2113        E100PCIDeviceInfo *info = &e100_devices[i];
2114
2115        type_info.name = info->name;
2116        type_info.parent = TYPE_PCI_DEVICE;
2117        type_info.class_init = eepro100_class_init;
2118        type_info.instance_size = sizeof(EEPRO100State);
2119        type_info.instance_init = eepro100_instance_init;
2120
2121        type_register(&type_info);
2122    }
2123}
2124
2125type_init(eepro100_register_types)
2126