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