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