qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

lan9118.c (41292B)


      1 /*
      2  * SMSC LAN9118 Ethernet interface emulation
      3  *
      4  * Copyright (c) 2009 CodeSourcery, LLC.
      5  * Written by Paul Brook
      6  *
      7  * This code is licensed under the GNU GPL v2
      8  *
      9  * Contributions after 2012-01-13 are licensed under the terms of the
     10  * GNU GPL, version 2 or (at your option) any later version.
     11  */
     12 
     13 #include "qemu/osdep.h"
     14 #include "hw/sysbus.h"
     15 #include "migration/vmstate.h"
     16 #include "net/net.h"
     17 #include "net/eth.h"
     18 #include "hw/hw.h"
     19 #include "hw/irq.h"
     20 #include "hw/net/lan9118.h"
     21 #include "hw/ptimer.h"
     22 #include "hw/qdev-properties.h"
     23 #include "qapi/error.h"
     24 #include "qemu/log.h"
     25 #include "qemu/module.h"
     26 /* For crc32 */
     27 #include <zlib.h>
     28 #include "qom/object.h"
     29 
     30 //#define DEBUG_LAN9118
     31 
     32 #ifdef DEBUG_LAN9118
     33 #define DPRINTF(fmt, ...) \
     34 do { printf("lan9118: " fmt , ## __VA_ARGS__); } while (0)
     35 #define BADF(fmt, ...) \
     36 do { hw_error("lan9118: error: " fmt , ## __VA_ARGS__);} while (0)
     37 #else
     38 #define DPRINTF(fmt, ...) do {} while(0)
     39 #define BADF(fmt, ...) \
     40 do { fprintf(stderr, "lan9118: error: " fmt , ## __VA_ARGS__);} while (0)
     41 #endif
     42 
     43 /* The tx and rx fifo ports are a range of aliased 32-bit registers */
     44 #define RX_DATA_FIFO_PORT_FIRST 0x00
     45 #define RX_DATA_FIFO_PORT_LAST 0x1f
     46 #define TX_DATA_FIFO_PORT_FIRST 0x20
     47 #define TX_DATA_FIFO_PORT_LAST 0x3f
     48 
     49 #define RX_STATUS_FIFO_PORT 0x40
     50 #define RX_STATUS_FIFO_PEEK 0x44
     51 #define TX_STATUS_FIFO_PORT 0x48
     52 #define TX_STATUS_FIFO_PEEK 0x4c
     53 
     54 #define CSR_ID_REV      0x50
     55 #define CSR_IRQ_CFG     0x54
     56 #define CSR_INT_STS     0x58
     57 #define CSR_INT_EN      0x5c
     58 #define CSR_BYTE_TEST   0x64
     59 #define CSR_FIFO_INT    0x68
     60 #define CSR_RX_CFG      0x6c
     61 #define CSR_TX_CFG      0x70
     62 #define CSR_HW_CFG      0x74
     63 #define CSR_RX_DP_CTRL  0x78
     64 #define CSR_RX_FIFO_INF 0x7c
     65 #define CSR_TX_FIFO_INF 0x80
     66 #define CSR_PMT_CTRL    0x84
     67 #define CSR_GPIO_CFG    0x88
     68 #define CSR_GPT_CFG     0x8c
     69 #define CSR_GPT_CNT     0x90
     70 #define CSR_WORD_SWAP   0x98
     71 #define CSR_FREE_RUN    0x9c
     72 #define CSR_RX_DROP     0xa0
     73 #define CSR_MAC_CSR_CMD 0xa4
     74 #define CSR_MAC_CSR_DATA 0xa8
     75 #define CSR_AFC_CFG     0xac
     76 #define CSR_E2P_CMD     0xb0
     77 #define CSR_E2P_DATA    0xb4
     78 
     79 #define E2P_CMD_MAC_ADDR_LOADED 0x100
     80 
     81 /* IRQ_CFG */
     82 #define IRQ_INT         0x00001000
     83 #define IRQ_EN          0x00000100
     84 #define IRQ_POL         0x00000010
     85 #define IRQ_TYPE        0x00000001
     86 
     87 /* INT_STS/INT_EN */
     88 #define SW_INT          0x80000000
     89 #define TXSTOP_INT      0x02000000
     90 #define RXSTOP_INT      0x01000000
     91 #define RXDFH_INT       0x00800000
     92 #define TX_IOC_INT      0x00200000
     93 #define RXD_INT         0x00100000
     94 #define GPT_INT         0x00080000
     95 #define PHY_INT         0x00040000
     96 #define PME_INT         0x00020000
     97 #define TXSO_INT        0x00010000
     98 #define RWT_INT         0x00008000
     99 #define RXE_INT         0x00004000
    100 #define TXE_INT         0x00002000
    101 #define TDFU_INT        0x00000800
    102 #define TDFO_INT        0x00000400
    103 #define TDFA_INT        0x00000200
    104 #define TSFF_INT        0x00000100
    105 #define TSFL_INT        0x00000080
    106 #define RXDF_INT        0x00000040
    107 #define RDFL_INT        0x00000020
    108 #define RSFF_INT        0x00000010
    109 #define RSFL_INT        0x00000008
    110 #define GPIO2_INT       0x00000004
    111 #define GPIO1_INT       0x00000002
    112 #define GPIO0_INT       0x00000001
    113 #define RESERVED_INT    0x7c001000
    114 
    115 #define MAC_CR          1
    116 #define MAC_ADDRH       2
    117 #define MAC_ADDRL       3
    118 #define MAC_HASHH       4
    119 #define MAC_HASHL       5
    120 #define MAC_MII_ACC     6
    121 #define MAC_MII_DATA    7
    122 #define MAC_FLOW        8
    123 #define MAC_VLAN1       9 /* TODO */
    124 #define MAC_VLAN2       10 /* TODO */
    125 #define MAC_WUFF        11 /* TODO */
    126 #define MAC_WUCSR       12 /* TODO */
    127 
    128 #define MAC_CR_RXALL    0x80000000
    129 #define MAC_CR_RCVOWN   0x00800000
    130 #define MAC_CR_LOOPBK   0x00200000
    131 #define MAC_CR_FDPX     0x00100000
    132 #define MAC_CR_MCPAS    0x00080000
    133 #define MAC_CR_PRMS     0x00040000
    134 #define MAC_CR_INVFILT  0x00020000
    135 #define MAC_CR_PASSBAD  0x00010000
    136 #define MAC_CR_HO       0x00008000
    137 #define MAC_CR_HPFILT   0x00002000
    138 #define MAC_CR_LCOLL    0x00001000
    139 #define MAC_CR_BCAST    0x00000800
    140 #define MAC_CR_DISRTY   0x00000400
    141 #define MAC_CR_PADSTR   0x00000100
    142 #define MAC_CR_BOLMT    0x000000c0
    143 #define MAC_CR_DFCHK    0x00000020
    144 #define MAC_CR_TXEN     0x00000008
    145 #define MAC_CR_RXEN     0x00000004
    146 #define MAC_CR_RESERVED 0x7f404213
    147 
    148 #define PHY_INT_ENERGYON            0x80
    149 #define PHY_INT_AUTONEG_COMPLETE    0x40
    150 #define PHY_INT_FAULT               0x20
    151 #define PHY_INT_DOWN                0x10
    152 #define PHY_INT_AUTONEG_LP          0x08
    153 #define PHY_INT_PARFAULT            0x04
    154 #define PHY_INT_AUTONEG_PAGE        0x02
    155 
    156 #define GPT_TIMER_EN    0x20000000
    157 
    158 enum tx_state {
    159     TX_IDLE,
    160     TX_B,
    161     TX_DATA
    162 };
    163 
    164 typedef struct {
    165     /* state is a tx_state but we can't put enums in VMStateDescriptions. */
    166     uint32_t state;
    167     uint32_t cmd_a;
    168     uint32_t cmd_b;
    169     int32_t buffer_size;
    170     int32_t offset;
    171     int32_t pad;
    172     int32_t fifo_used;
    173     int32_t len;
    174     uint8_t data[2048];
    175 } LAN9118Packet;
    176 
    177 static const VMStateDescription vmstate_lan9118_packet = {
    178     .name = "lan9118_packet",
    179     .version_id = 1,
    180     .minimum_version_id = 1,
    181     .fields = (VMStateField[]) {
    182         VMSTATE_UINT32(state, LAN9118Packet),
    183         VMSTATE_UINT32(cmd_a, LAN9118Packet),
    184         VMSTATE_UINT32(cmd_b, LAN9118Packet),
    185         VMSTATE_INT32(buffer_size, LAN9118Packet),
    186         VMSTATE_INT32(offset, LAN9118Packet),
    187         VMSTATE_INT32(pad, LAN9118Packet),
    188         VMSTATE_INT32(fifo_used, LAN9118Packet),
    189         VMSTATE_INT32(len, LAN9118Packet),
    190         VMSTATE_UINT8_ARRAY(data, LAN9118Packet, 2048),
    191         VMSTATE_END_OF_LIST()
    192     }
    193 };
    194 
    195 OBJECT_DECLARE_SIMPLE_TYPE(lan9118_state, LAN9118)
    196 
    197 struct lan9118_state {
    198     SysBusDevice parent_obj;
    199 
    200     NICState *nic;
    201     NICConf conf;
    202     qemu_irq irq;
    203     MemoryRegion mmio;
    204     ptimer_state *timer;
    205 
    206     uint32_t irq_cfg;
    207     uint32_t int_sts;
    208     uint32_t int_en;
    209     uint32_t fifo_int;
    210     uint32_t rx_cfg;
    211     uint32_t tx_cfg;
    212     uint32_t hw_cfg;
    213     uint32_t pmt_ctrl;
    214     uint32_t gpio_cfg;
    215     uint32_t gpt_cfg;
    216     uint32_t word_swap;
    217     uint32_t free_timer_start;
    218     uint32_t mac_cmd;
    219     uint32_t mac_data;
    220     uint32_t afc_cfg;
    221     uint32_t e2p_cmd;
    222     uint32_t e2p_data;
    223 
    224     uint32_t mac_cr;
    225     uint32_t mac_hashh;
    226     uint32_t mac_hashl;
    227     uint32_t mac_mii_acc;
    228     uint32_t mac_mii_data;
    229     uint32_t mac_flow;
    230 
    231     uint32_t phy_status;
    232     uint32_t phy_control;
    233     uint32_t phy_advertise;
    234     uint32_t phy_int;
    235     uint32_t phy_int_mask;
    236 
    237     int32_t eeprom_writable;
    238     uint8_t eeprom[128];
    239 
    240     int32_t tx_fifo_size;
    241     LAN9118Packet *txp;
    242     LAN9118Packet tx_packet;
    243 
    244     int32_t tx_status_fifo_used;
    245     int32_t tx_status_fifo_head;
    246     uint32_t tx_status_fifo[512];
    247 
    248     int32_t rx_status_fifo_size;
    249     int32_t rx_status_fifo_used;
    250     int32_t rx_status_fifo_head;
    251     uint32_t rx_status_fifo[896];
    252     int32_t rx_fifo_size;
    253     int32_t rx_fifo_used;
    254     int32_t rx_fifo_head;
    255     uint32_t rx_fifo[3360];
    256     int32_t rx_packet_size_head;
    257     int32_t rx_packet_size_tail;
    258     int32_t rx_packet_size[1024];
    259 
    260     int32_t rxp_offset;
    261     int32_t rxp_size;
    262     int32_t rxp_pad;
    263 
    264     uint32_t write_word_prev_offset;
    265     uint32_t write_word_n;
    266     uint16_t write_word_l;
    267     uint16_t write_word_h;
    268     uint32_t read_word_prev_offset;
    269     uint32_t read_word_n;
    270     uint32_t read_long;
    271 
    272     uint32_t mode_16bit;
    273 };
    274 
    275 static const VMStateDescription vmstate_lan9118 = {
    276     .name = "lan9118",
    277     .version_id = 2,
    278     .minimum_version_id = 1,
    279     .fields = (VMStateField[]) {
    280         VMSTATE_PTIMER(timer, lan9118_state),
    281         VMSTATE_UINT32(irq_cfg, lan9118_state),
    282         VMSTATE_UINT32(int_sts, lan9118_state),
    283         VMSTATE_UINT32(int_en, lan9118_state),
    284         VMSTATE_UINT32(fifo_int, lan9118_state),
    285         VMSTATE_UINT32(rx_cfg, lan9118_state),
    286         VMSTATE_UINT32(tx_cfg, lan9118_state),
    287         VMSTATE_UINT32(hw_cfg, lan9118_state),
    288         VMSTATE_UINT32(pmt_ctrl, lan9118_state),
    289         VMSTATE_UINT32(gpio_cfg, lan9118_state),
    290         VMSTATE_UINT32(gpt_cfg, lan9118_state),
    291         VMSTATE_UINT32(word_swap, lan9118_state),
    292         VMSTATE_UINT32(free_timer_start, lan9118_state),
    293         VMSTATE_UINT32(mac_cmd, lan9118_state),
    294         VMSTATE_UINT32(mac_data, lan9118_state),
    295         VMSTATE_UINT32(afc_cfg, lan9118_state),
    296         VMSTATE_UINT32(e2p_cmd, lan9118_state),
    297         VMSTATE_UINT32(e2p_data, lan9118_state),
    298         VMSTATE_UINT32(mac_cr, lan9118_state),
    299         VMSTATE_UINT32(mac_hashh, lan9118_state),
    300         VMSTATE_UINT32(mac_hashl, lan9118_state),
    301         VMSTATE_UINT32(mac_mii_acc, lan9118_state),
    302         VMSTATE_UINT32(mac_mii_data, lan9118_state),
    303         VMSTATE_UINT32(mac_flow, lan9118_state),
    304         VMSTATE_UINT32(phy_status, lan9118_state),
    305         VMSTATE_UINT32(phy_control, lan9118_state),
    306         VMSTATE_UINT32(phy_advertise, lan9118_state),
    307         VMSTATE_UINT32(phy_int, lan9118_state),
    308         VMSTATE_UINT32(phy_int_mask, lan9118_state),
    309         VMSTATE_INT32(eeprom_writable, lan9118_state),
    310         VMSTATE_UINT8_ARRAY(eeprom, lan9118_state, 128),
    311         VMSTATE_INT32(tx_fifo_size, lan9118_state),
    312         /* txp always points at tx_packet so need not be saved */
    313         VMSTATE_STRUCT(tx_packet, lan9118_state, 0,
    314                        vmstate_lan9118_packet, LAN9118Packet),
    315         VMSTATE_INT32(tx_status_fifo_used, lan9118_state),
    316         VMSTATE_INT32(tx_status_fifo_head, lan9118_state),
    317         VMSTATE_UINT32_ARRAY(tx_status_fifo, lan9118_state, 512),
    318         VMSTATE_INT32(rx_status_fifo_size, lan9118_state),
    319         VMSTATE_INT32(rx_status_fifo_used, lan9118_state),
    320         VMSTATE_INT32(rx_status_fifo_head, lan9118_state),
    321         VMSTATE_UINT32_ARRAY(rx_status_fifo, lan9118_state, 896),
    322         VMSTATE_INT32(rx_fifo_size, lan9118_state),
    323         VMSTATE_INT32(rx_fifo_used, lan9118_state),
    324         VMSTATE_INT32(rx_fifo_head, lan9118_state),
    325         VMSTATE_UINT32_ARRAY(rx_fifo, lan9118_state, 3360),
    326         VMSTATE_INT32(rx_packet_size_head, lan9118_state),
    327         VMSTATE_INT32(rx_packet_size_tail, lan9118_state),
    328         VMSTATE_INT32_ARRAY(rx_packet_size, lan9118_state, 1024),
    329         VMSTATE_INT32(rxp_offset, lan9118_state),
    330         VMSTATE_INT32(rxp_size, lan9118_state),
    331         VMSTATE_INT32(rxp_pad, lan9118_state),
    332         VMSTATE_UINT32_V(write_word_prev_offset, lan9118_state, 2),
    333         VMSTATE_UINT32_V(write_word_n, lan9118_state, 2),
    334         VMSTATE_UINT16_V(write_word_l, lan9118_state, 2),
    335         VMSTATE_UINT16_V(write_word_h, lan9118_state, 2),
    336         VMSTATE_UINT32_V(read_word_prev_offset, lan9118_state, 2),
    337         VMSTATE_UINT32_V(read_word_n, lan9118_state, 2),
    338         VMSTATE_UINT32_V(read_long, lan9118_state, 2),
    339         VMSTATE_UINT32_V(mode_16bit, lan9118_state, 2),
    340         VMSTATE_END_OF_LIST()
    341     }
    342 };
    343 
    344 static void lan9118_update(lan9118_state *s)
    345 {
    346     int level;
    347 
    348     /* TODO: Implement FIFO level IRQs.  */
    349     level = (s->int_sts & s->int_en) != 0;
    350     if (level) {
    351         s->irq_cfg |= IRQ_INT;
    352     } else {
    353         s->irq_cfg &= ~IRQ_INT;
    354     }
    355     if ((s->irq_cfg & IRQ_EN) == 0) {
    356         level = 0;
    357     }
    358     if ((s->irq_cfg & (IRQ_TYPE | IRQ_POL)) != (IRQ_TYPE | IRQ_POL)) {
    359         /* Interrupt is active low unless we're configured as
    360          * active-high polarity, push-pull type.
    361          */
    362         level = !level;
    363     }
    364     qemu_set_irq(s->irq, level);
    365 }
    366 
    367 static void lan9118_mac_changed(lan9118_state *s)
    368 {
    369     qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
    370 }
    371 
    372 static void lan9118_reload_eeprom(lan9118_state *s)
    373 {
    374     int i;
    375     if (s->eeprom[0] != 0xa5) {
    376         s->e2p_cmd &= ~E2P_CMD_MAC_ADDR_LOADED;
    377         DPRINTF("MACADDR load failed\n");
    378         return;
    379     }
    380     for (i = 0; i < 6; i++) {
    381         s->conf.macaddr.a[i] = s->eeprom[i + 1];
    382     }
    383     s->e2p_cmd |= E2P_CMD_MAC_ADDR_LOADED;
    384     DPRINTF("MACADDR loaded from eeprom\n");
    385     lan9118_mac_changed(s);
    386 }
    387 
    388 static void phy_update_irq(lan9118_state *s)
    389 {
    390     if (s->phy_int & s->phy_int_mask) {
    391         s->int_sts |= PHY_INT;
    392     } else {
    393         s->int_sts &= ~PHY_INT;
    394     }
    395     lan9118_update(s);
    396 }
    397 
    398 static void phy_update_link(lan9118_state *s)
    399 {
    400     /* Autonegotiation status mirrors link status.  */
    401     if (qemu_get_queue(s->nic)->link_down) {
    402         s->phy_status &= ~0x0024;
    403         s->phy_int |= PHY_INT_DOWN;
    404     } else {
    405         s->phy_status |= 0x0024;
    406         s->phy_int |= PHY_INT_ENERGYON;
    407         s->phy_int |= PHY_INT_AUTONEG_COMPLETE;
    408     }
    409     phy_update_irq(s);
    410 }
    411 
    412 static void lan9118_set_link(NetClientState *nc)
    413 {
    414     phy_update_link(qemu_get_nic_opaque(nc));
    415 }
    416 
    417 static void phy_reset(lan9118_state *s)
    418 {
    419     s->phy_status = 0x7809;
    420     s->phy_control = 0x3000;
    421     s->phy_advertise = 0x01e1;
    422     s->phy_int_mask = 0;
    423     s->phy_int = 0;
    424     phy_update_link(s);
    425 }
    426 
    427 static void lan9118_reset(DeviceState *d)
    428 {
    429     lan9118_state *s = LAN9118(d);
    430 
    431     s->irq_cfg &= (IRQ_TYPE | IRQ_POL);
    432     s->int_sts = 0;
    433     s->int_en = 0;
    434     s->fifo_int = 0x48000000;
    435     s->rx_cfg = 0;
    436     s->tx_cfg = 0;
    437     s->hw_cfg = s->mode_16bit ? 0x00050000 : 0x00050004;
    438     s->pmt_ctrl &= 0x45;
    439     s->gpio_cfg = 0;
    440     s->txp->fifo_used = 0;
    441     s->txp->state = TX_IDLE;
    442     s->txp->cmd_a = 0xffffffffu;
    443     s->txp->cmd_b = 0xffffffffu;
    444     s->txp->len = 0;
    445     s->txp->fifo_used = 0;
    446     s->tx_fifo_size = 4608;
    447     s->tx_status_fifo_used = 0;
    448     s->rx_status_fifo_size = 704;
    449     s->rx_fifo_size = 2640;
    450     s->rx_fifo_used = 0;
    451     s->rx_status_fifo_size = 176;
    452     s->rx_status_fifo_used = 0;
    453     s->rxp_offset = 0;
    454     s->rxp_size = 0;
    455     s->rxp_pad = 0;
    456     s->rx_packet_size_tail = s->rx_packet_size_head;
    457     s->rx_packet_size[s->rx_packet_size_head] = 0;
    458     s->mac_cmd = 0;
    459     s->mac_data = 0;
    460     s->afc_cfg = 0;
    461     s->e2p_cmd = 0;
    462     s->e2p_data = 0;
    463     s->free_timer_start = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / 40;
    464 
    465     ptimer_transaction_begin(s->timer);
    466     ptimer_stop(s->timer);
    467     ptimer_set_count(s->timer, 0xffff);
    468     ptimer_transaction_commit(s->timer);
    469     s->gpt_cfg = 0xffff;
    470 
    471     s->mac_cr = MAC_CR_PRMS;
    472     s->mac_hashh = 0;
    473     s->mac_hashl = 0;
    474     s->mac_mii_acc = 0;
    475     s->mac_mii_data = 0;
    476     s->mac_flow = 0;
    477 
    478     s->read_word_n = 0;
    479     s->write_word_n = 0;
    480 
    481     phy_reset(s);
    482 
    483     s->eeprom_writable = 0;
    484     lan9118_reload_eeprom(s);
    485 }
    486 
    487 static void rx_fifo_push(lan9118_state *s, uint32_t val)
    488 {
    489     int fifo_pos;
    490     fifo_pos = s->rx_fifo_head + s->rx_fifo_used;
    491     if (fifo_pos >= s->rx_fifo_size)
    492       fifo_pos -= s->rx_fifo_size;
    493     s->rx_fifo[fifo_pos] = val;
    494     s->rx_fifo_used++;
    495 }
    496 
    497 /* Return nonzero if the packet is accepted by the filter.  */
    498 static int lan9118_filter(lan9118_state *s, const uint8_t *addr)
    499 {
    500     int multicast;
    501     uint32_t hash;
    502 
    503     if (s->mac_cr & MAC_CR_PRMS) {
    504         return 1;
    505     }
    506     if (addr[0] == 0xff && addr[1] == 0xff && addr[2] == 0xff &&
    507         addr[3] == 0xff && addr[4] == 0xff && addr[5] == 0xff) {
    508         return (s->mac_cr & MAC_CR_BCAST) == 0;
    509     }
    510 
    511     multicast = addr[0] & 1;
    512     if (multicast &&s->mac_cr & MAC_CR_MCPAS) {
    513         return 1;
    514     }
    515     if (multicast ? (s->mac_cr & MAC_CR_HPFILT) == 0
    516                   : (s->mac_cr & MAC_CR_HO) == 0) {
    517         /* Exact matching.  */
    518         hash = memcmp(addr, s->conf.macaddr.a, 6);
    519         if (s->mac_cr & MAC_CR_INVFILT) {
    520             return hash != 0;
    521         } else {
    522             return hash == 0;
    523         }
    524     } else {
    525         /* Hash matching  */
    526         hash = net_crc32(addr, ETH_ALEN) >> 26;
    527         if (hash & 0x20) {
    528             return (s->mac_hashh >> (hash & 0x1f)) & 1;
    529         } else {
    530             return (s->mac_hashl >> (hash & 0x1f)) & 1;
    531         }
    532     }
    533 }
    534 
    535 static ssize_t lan9118_receive(NetClientState *nc, const uint8_t *buf,
    536                                size_t size)
    537 {
    538     lan9118_state *s = qemu_get_nic_opaque(nc);
    539     int fifo_len;
    540     int offset;
    541     int src_pos;
    542     int n;
    543     int filter;
    544     uint32_t val;
    545     uint32_t crc;
    546     uint32_t status;
    547 
    548     if ((s->mac_cr & MAC_CR_RXEN) == 0) {
    549         return -1;
    550     }
    551 
    552     if (size >= 2048 || size < 14) {
    553         return -1;
    554     }
    555 
    556     /* TODO: Implement FIFO overflow notification.  */
    557     if (s->rx_status_fifo_used == s->rx_status_fifo_size) {
    558         return -1;
    559     }
    560 
    561     filter = lan9118_filter(s, buf);
    562     if (!filter && (s->mac_cr & MAC_CR_RXALL) == 0) {
    563         return size;
    564     }
    565 
    566     offset = (s->rx_cfg >> 8) & 0x1f;
    567     n = offset & 3;
    568     fifo_len = (size + n + 3) >> 2;
    569     /* Add a word for the CRC.  */
    570     fifo_len++;
    571     if (s->rx_fifo_size - s->rx_fifo_used < fifo_len) {
    572         return -1;
    573     }
    574 
    575     DPRINTF("Got packet len:%d fifo:%d filter:%s\n",
    576             (int)size, fifo_len, filter ? "pass" : "fail");
    577     val = 0;
    578     crc = bswap32(crc32(~0, buf, size));
    579     for (src_pos = 0; src_pos < size; src_pos++) {
    580         val = (val >> 8) | ((uint32_t)buf[src_pos] << 24);
    581         n++;
    582         if (n == 4) {
    583             n = 0;
    584             rx_fifo_push(s, val);
    585             val = 0;
    586         }
    587     }
    588     if (n) {
    589         val >>= ((4 - n) * 8);
    590         val |= crc << (n * 8);
    591         rx_fifo_push(s, val);
    592         val = crc >> ((4 - n) * 8);
    593         rx_fifo_push(s, val);
    594     } else {
    595         rx_fifo_push(s, crc);
    596     }
    597     n = s->rx_status_fifo_head + s->rx_status_fifo_used;
    598     if (n >= s->rx_status_fifo_size) {
    599         n -= s->rx_status_fifo_size;
    600     }
    601     s->rx_packet_size[s->rx_packet_size_tail] = fifo_len;
    602     s->rx_packet_size_tail = (s->rx_packet_size_tail + 1023) & 1023;
    603     s->rx_status_fifo_used++;
    604 
    605     status = (size + 4) << 16;
    606     if (buf[0] == 0xff && buf[1] == 0xff && buf[2] == 0xff &&
    607         buf[3] == 0xff && buf[4] == 0xff && buf[5] == 0xff) {
    608         status |= 0x00002000;
    609     } else if (buf[0] & 1) {
    610         status |= 0x00000400;
    611     }
    612     if (!filter) {
    613         status |= 0x40000000;
    614     }
    615     s->rx_status_fifo[n] = status;
    616 
    617     if (s->rx_status_fifo_used > (s->fifo_int & 0xff)) {
    618         s->int_sts |= RSFL_INT;
    619     }
    620     lan9118_update(s);
    621 
    622     return size;
    623 }
    624 
    625 static uint32_t rx_fifo_pop(lan9118_state *s)
    626 {
    627     int n;
    628     uint32_t val;
    629 
    630     if (s->rxp_size == 0 && s->rxp_pad == 0) {
    631         s->rxp_size = s->rx_packet_size[s->rx_packet_size_head];
    632         s->rx_packet_size[s->rx_packet_size_head] = 0;
    633         if (s->rxp_size != 0) {
    634             s->rx_packet_size_head = (s->rx_packet_size_head + 1023) & 1023;
    635             s->rxp_offset = (s->rx_cfg >> 10) & 7;
    636             n = s->rxp_offset + s->rxp_size;
    637             switch (s->rx_cfg >> 30) {
    638             case 1:
    639                 n = (-n) & 3;
    640                 break;
    641             case 2:
    642                 n = (-n) & 7;
    643                 break;
    644             default:
    645                 n = 0;
    646                 break;
    647             }
    648             s->rxp_pad = n;
    649             DPRINTF("Pop packet size:%d offset:%d pad: %d\n",
    650                     s->rxp_size, s->rxp_offset, s->rxp_pad);
    651         }
    652     }
    653     if (s->rxp_offset > 0) {
    654         s->rxp_offset--;
    655         val = 0;
    656     } else if (s->rxp_size > 0) {
    657         s->rxp_size--;
    658         val = s->rx_fifo[s->rx_fifo_head++];
    659         if (s->rx_fifo_head >= s->rx_fifo_size) {
    660             s->rx_fifo_head -= s->rx_fifo_size;
    661         }
    662         s->rx_fifo_used--;
    663     } else if (s->rxp_pad > 0) {
    664         s->rxp_pad--;
    665         val =  0;
    666     } else {
    667         DPRINTF("RX underflow\n");
    668         s->int_sts |= RXE_INT;
    669         val =  0;
    670     }
    671     lan9118_update(s);
    672     return val;
    673 }
    674 
    675 static void do_tx_packet(lan9118_state *s)
    676 {
    677     int n;
    678     uint32_t status;
    679 
    680     /* FIXME: Honor TX disable, and allow queueing of packets.  */
    681     if (s->phy_control & 0x4000)  {
    682         /* This assumes the receive routine doesn't touch the VLANClient.  */
    683         qemu_receive_packet(qemu_get_queue(s->nic), s->txp->data, s->txp->len);
    684     } else {
    685         qemu_send_packet(qemu_get_queue(s->nic), s->txp->data, s->txp->len);
    686     }
    687     s->txp->fifo_used = 0;
    688 
    689     if (s->tx_status_fifo_used == 512) {
    690         /* Status FIFO full */
    691         return;
    692     }
    693     /* Add entry to status FIFO.  */
    694     status = s->txp->cmd_b & 0xffff0000u;
    695     DPRINTF("Sent packet tag:%04x len %d\n", status >> 16, s->txp->len);
    696     n = (s->tx_status_fifo_head + s->tx_status_fifo_used) & 511;
    697     s->tx_status_fifo[n] = status;
    698     s->tx_status_fifo_used++;
    699 
    700     /*
    701      * Generate TSFL interrupt if TX FIFO level exceeds the level
    702      * specified in the FIFO_INT TX Status Level field.
    703      */
    704     if (s->tx_status_fifo_used > ((s->fifo_int >> 16) & 0xff)) {
    705         s->int_sts |= TSFL_INT;
    706     }
    707     if (s->tx_status_fifo_used == 512) {
    708         s->int_sts |= TSFF_INT;
    709         /* TODO: Stop transmission.  */
    710     }
    711 }
    712 
    713 static uint32_t rx_status_fifo_pop(lan9118_state *s)
    714 {
    715     uint32_t val;
    716 
    717     val = s->rx_status_fifo[s->rx_status_fifo_head];
    718     if (s->rx_status_fifo_used != 0) {
    719         s->rx_status_fifo_used--;
    720         s->rx_status_fifo_head++;
    721         if (s->rx_status_fifo_head >= s->rx_status_fifo_size) {
    722             s->rx_status_fifo_head -= s->rx_status_fifo_size;
    723         }
    724         /* ??? What value should be returned when the FIFO is empty?  */
    725         DPRINTF("RX status pop 0x%08x\n", val);
    726     }
    727     return val;
    728 }
    729 
    730 static uint32_t tx_status_fifo_pop(lan9118_state *s)
    731 {
    732     uint32_t val;
    733 
    734     val = s->tx_status_fifo[s->tx_status_fifo_head];
    735     if (s->tx_status_fifo_used != 0) {
    736         s->tx_status_fifo_used--;
    737         s->tx_status_fifo_head = (s->tx_status_fifo_head + 1) & 511;
    738         /* ??? What value should be returned when the FIFO is empty?  */
    739     }
    740     return val;
    741 }
    742 
    743 static void tx_fifo_push(lan9118_state *s, uint32_t val)
    744 {
    745     int n;
    746 
    747     if (s->txp->fifo_used == s->tx_fifo_size) {
    748         s->int_sts |= TDFO_INT;
    749         return;
    750     }
    751     switch (s->txp->state) {
    752     case TX_IDLE:
    753         s->txp->cmd_a = val & 0x831f37ff;
    754         s->txp->fifo_used++;
    755         s->txp->state = TX_B;
    756         s->txp->buffer_size = extract32(s->txp->cmd_a, 0, 11);
    757         s->txp->offset = extract32(s->txp->cmd_a, 16, 5);
    758         break;
    759     case TX_B:
    760         if (s->txp->cmd_a & 0x2000) {
    761             /* First segment */
    762             s->txp->cmd_b = val;
    763             s->txp->fifo_used++;
    764             /* End alignment does not include command words.  */
    765             n = (s->txp->buffer_size + s->txp->offset + 3) >> 2;
    766             switch ((n >> 24) & 3) {
    767             case 1:
    768                 n = (-n) & 3;
    769                 break;
    770             case 2:
    771                 n = (-n) & 7;
    772                 break;
    773             default:
    774                 n = 0;
    775             }
    776             s->txp->pad = n;
    777             s->txp->len = 0;
    778         }
    779         DPRINTF("Block len:%d offset:%d pad:%d cmd %08x\n",
    780                 s->txp->buffer_size, s->txp->offset, s->txp->pad,
    781                 s->txp->cmd_a);
    782         s->txp->state = TX_DATA;
    783         break;
    784     case TX_DATA:
    785         if (s->txp->offset >= 4) {
    786             s->txp->offset -= 4;
    787             break;
    788         }
    789         if (s->txp->buffer_size <= 0 && s->txp->pad != 0) {
    790             s->txp->pad--;
    791         } else {
    792             n = MIN(4, s->txp->buffer_size + s->txp->offset);
    793             while (s->txp->offset) {
    794                 val >>= 8;
    795                 n--;
    796                 s->txp->offset--;
    797             }
    798             /* Documentation is somewhat unclear on the ordering of bytes
    799                in FIFO words.  Empirical results show it to be little-endian.
    800                */
    801             /* TODO: FIFO overflow checking.  */
    802             while (n--) {
    803                 s->txp->data[s->txp->len] = val & 0xff;
    804                 s->txp->len++;
    805                 val >>= 8;
    806                 s->txp->buffer_size--;
    807             }
    808             s->txp->fifo_used++;
    809         }
    810         if (s->txp->buffer_size <= 0 && s->txp->pad == 0) {
    811             if (s->txp->cmd_a & 0x1000) {
    812                 do_tx_packet(s);
    813             }
    814             if (s->txp->cmd_a & 0x80000000) {
    815                 s->int_sts |= TX_IOC_INT;
    816             }
    817             s->txp->state = TX_IDLE;
    818         }
    819         break;
    820     }
    821 }
    822 
    823 static uint32_t do_phy_read(lan9118_state *s, int reg)
    824 {
    825     uint32_t val;
    826 
    827     switch (reg) {
    828     case 0: /* Basic Control */
    829         return s->phy_control;
    830     case 1: /* Basic Status */
    831         return s->phy_status;
    832     case 2: /* ID1 */
    833         return 0x0007;
    834     case 3: /* ID2 */
    835         return 0xc0d1;
    836     case 4: /* Auto-neg advertisement */
    837         return s->phy_advertise;
    838     case 5: /* Auto-neg Link Partner Ability */
    839         return 0x0f71;
    840     case 6: /* Auto-neg Expansion */
    841         return 1;
    842         /* TODO 17, 18, 27, 29, 30, 31 */
    843     case 29: /* Interrupt source.  */
    844         val = s->phy_int;
    845         s->phy_int = 0;
    846         phy_update_irq(s);
    847         return val;
    848     case 30: /* Interrupt mask */
    849         return s->phy_int_mask;
    850     default:
    851         BADF("PHY read reg %d\n", reg);
    852         return 0;
    853     }
    854 }
    855 
    856 static void do_phy_write(lan9118_state *s, int reg, uint32_t val)
    857 {
    858     switch (reg) {
    859     case 0: /* Basic Control */
    860         if (val & 0x8000) {
    861             phy_reset(s);
    862             break;
    863         }
    864         s->phy_control = val & 0x7980;
    865         /* Complete autonegotiation immediately.  */
    866         if (val & 0x1000) {
    867             s->phy_status |= 0x0020;
    868         }
    869         break;
    870     case 4: /* Auto-neg advertisement */
    871         s->phy_advertise = (val & 0x2d7f) | 0x80;
    872         break;
    873         /* TODO 17, 18, 27, 31 */
    874     case 30: /* Interrupt mask */
    875         s->phy_int_mask = val & 0xff;
    876         phy_update_irq(s);
    877         break;
    878     default:
    879         BADF("PHY write reg %d = 0x%04x\n", reg, val);
    880     }
    881 }
    882 
    883 static void do_mac_write(lan9118_state *s, int reg, uint32_t val)
    884 {
    885     switch (reg) {
    886     case MAC_CR:
    887         if ((s->mac_cr & MAC_CR_RXEN) != 0 && (val & MAC_CR_RXEN) == 0) {
    888             s->int_sts |= RXSTOP_INT;
    889         }
    890         s->mac_cr = val & ~MAC_CR_RESERVED;
    891         DPRINTF("MAC_CR: %08x\n", val);
    892         break;
    893     case MAC_ADDRH:
    894         s->conf.macaddr.a[4] = val & 0xff;
    895         s->conf.macaddr.a[5] = (val >> 8) & 0xff;
    896         lan9118_mac_changed(s);
    897         break;
    898     case MAC_ADDRL:
    899         s->conf.macaddr.a[0] = val & 0xff;
    900         s->conf.macaddr.a[1] = (val >> 8) & 0xff;
    901         s->conf.macaddr.a[2] = (val >> 16) & 0xff;
    902         s->conf.macaddr.a[3] = (val >> 24) & 0xff;
    903         lan9118_mac_changed(s);
    904         break;
    905     case MAC_HASHH:
    906         s->mac_hashh = val;
    907         break;
    908     case MAC_HASHL:
    909         s->mac_hashl = val;
    910         break;
    911     case MAC_MII_ACC:
    912         s->mac_mii_acc = val & 0xffc2;
    913         if (val & 2) {
    914             DPRINTF("PHY write %d = 0x%04x\n",
    915                     (val >> 6) & 0x1f, s->mac_mii_data);
    916             do_phy_write(s, (val >> 6) & 0x1f, s->mac_mii_data);
    917         } else {
    918             s->mac_mii_data = do_phy_read(s, (val >> 6) & 0x1f);
    919             DPRINTF("PHY read %d = 0x%04x\n",
    920                     (val >> 6) & 0x1f, s->mac_mii_data);
    921         }
    922         break;
    923     case MAC_MII_DATA:
    924         s->mac_mii_data = val & 0xffff;
    925         break;
    926     case MAC_FLOW:
    927         s->mac_flow = val & 0xffff0000;
    928         break;
    929     case MAC_VLAN1:
    930         /* Writing to this register changes a condition for
    931          * FrameTooLong bit in rx_status.  Since we do not set
    932          * FrameTooLong anyway, just ignore write to this.
    933          */
    934         break;
    935     default:
    936         qemu_log_mask(LOG_GUEST_ERROR,
    937                       "lan9118: Unimplemented MAC register write: %d = 0x%x\n",
    938                  s->mac_cmd & 0xf, val);
    939     }
    940 }
    941 
    942 static uint32_t do_mac_read(lan9118_state *s, int reg)
    943 {
    944     switch (reg) {
    945     case MAC_CR:
    946         return s->mac_cr;
    947     case MAC_ADDRH:
    948         return s->conf.macaddr.a[4] | (s->conf.macaddr.a[5] << 8);
    949     case MAC_ADDRL:
    950         return s->conf.macaddr.a[0] | (s->conf.macaddr.a[1] << 8)
    951                | (s->conf.macaddr.a[2] << 16) | (s->conf.macaddr.a[3] << 24);
    952     case MAC_HASHH:
    953         return s->mac_hashh;
    954     case MAC_HASHL:
    955         return s->mac_hashl;
    956     case MAC_MII_ACC:
    957         return s->mac_mii_acc;
    958     case MAC_MII_DATA:
    959         return s->mac_mii_data;
    960     case MAC_FLOW:
    961         return s->mac_flow;
    962     default:
    963         qemu_log_mask(LOG_GUEST_ERROR,
    964                       "lan9118: Unimplemented MAC register read: %d\n",
    965                  s->mac_cmd & 0xf);
    966         return 0;
    967     }
    968 }
    969 
    970 static void lan9118_eeprom_cmd(lan9118_state *s, int cmd, int addr)
    971 {
    972     s->e2p_cmd = (s->e2p_cmd & E2P_CMD_MAC_ADDR_LOADED) | (cmd << 28) | addr;
    973     switch (cmd) {
    974     case 0:
    975         s->e2p_data = s->eeprom[addr];
    976         DPRINTF("EEPROM Read %d = 0x%02x\n", addr, s->e2p_data);
    977         break;
    978     case 1:
    979         s->eeprom_writable = 0;
    980         DPRINTF("EEPROM Write Disable\n");
    981         break;
    982     case 2: /* EWEN */
    983         s->eeprom_writable = 1;
    984         DPRINTF("EEPROM Write Enable\n");
    985         break;
    986     case 3: /* WRITE */
    987         if (s->eeprom_writable) {
    988             s->eeprom[addr] &= s->e2p_data;
    989             DPRINTF("EEPROM Write %d = 0x%02x\n", addr, s->e2p_data);
    990         } else {
    991             DPRINTF("EEPROM Write %d (ignored)\n", addr);
    992         }
    993         break;
    994     case 4: /* WRAL */
    995         if (s->eeprom_writable) {
    996             for (addr = 0; addr < 128; addr++) {
    997                 s->eeprom[addr] &= s->e2p_data;
    998             }
    999             DPRINTF("EEPROM Write All 0x%02x\n", s->e2p_data);
   1000         } else {
   1001             DPRINTF("EEPROM Write All (ignored)\n");
   1002         }
   1003         break;
   1004     case 5: /* ERASE */
   1005         if (s->eeprom_writable) {
   1006             s->eeprom[addr] = 0xff;
   1007             DPRINTF("EEPROM Erase %d\n", addr);
   1008         } else {
   1009             DPRINTF("EEPROM Erase %d (ignored)\n", addr);
   1010         }
   1011         break;
   1012     case 6: /* ERAL */
   1013         if (s->eeprom_writable) {
   1014             memset(s->eeprom, 0xff, 128);
   1015             DPRINTF("EEPROM Erase All\n");
   1016         } else {
   1017             DPRINTF("EEPROM Erase All (ignored)\n");
   1018         }
   1019         break;
   1020     case 7: /* RELOAD */
   1021         lan9118_reload_eeprom(s);
   1022         break;
   1023     }
   1024 }
   1025 
   1026 static void lan9118_tick(void *opaque)
   1027 {
   1028     lan9118_state *s = (lan9118_state *)opaque;
   1029     if (s->int_en & GPT_INT) {
   1030         s->int_sts |= GPT_INT;
   1031     }
   1032     lan9118_update(s);
   1033 }
   1034 
   1035 static void lan9118_writel(void *opaque, hwaddr offset,
   1036                            uint64_t val, unsigned size)
   1037 {
   1038     lan9118_state *s = (lan9118_state *)opaque;
   1039     offset &= 0xff;
   1040 
   1041     //DPRINTF("Write reg 0x%02x = 0x%08x\n", (int)offset, val);
   1042     if (offset >= TX_DATA_FIFO_PORT_FIRST &&
   1043         offset <= TX_DATA_FIFO_PORT_LAST) {
   1044         /* TX FIFO */
   1045         tx_fifo_push(s, val);
   1046         return;
   1047     }
   1048     switch (offset) {
   1049     case CSR_IRQ_CFG:
   1050         /* TODO: Implement interrupt deassertion intervals.  */
   1051         val &= (IRQ_EN | IRQ_POL | IRQ_TYPE);
   1052         s->irq_cfg = (s->irq_cfg & IRQ_INT) | val;
   1053         break;
   1054     case CSR_INT_STS:
   1055         s->int_sts &= ~val;
   1056         break;
   1057     case CSR_INT_EN:
   1058         s->int_en = val & ~RESERVED_INT;
   1059         s->int_sts |= val & SW_INT;
   1060         break;
   1061     case CSR_FIFO_INT:
   1062         DPRINTF("FIFO INT levels %08x\n", val);
   1063         s->fifo_int = val;
   1064         break;
   1065     case CSR_RX_CFG:
   1066         if (val & 0x8000) {
   1067             /* RX_DUMP */
   1068             s->rx_fifo_used = 0;
   1069             s->rx_status_fifo_used = 0;
   1070             s->rx_packet_size_tail = s->rx_packet_size_head;
   1071             s->rx_packet_size[s->rx_packet_size_head] = 0;
   1072         }
   1073         s->rx_cfg = val & 0xcfff1ff0;
   1074         break;
   1075     case CSR_TX_CFG:
   1076         if (val & 0x8000) {
   1077             s->tx_status_fifo_used = 0;
   1078         }
   1079         if (val & 0x4000) {
   1080             s->txp->state = TX_IDLE;
   1081             s->txp->fifo_used = 0;
   1082             s->txp->cmd_a = 0xffffffff;
   1083         }
   1084         s->tx_cfg = val & 6;
   1085         break;
   1086     case CSR_HW_CFG:
   1087         if (val & 1) {
   1088             /* SRST */
   1089             lan9118_reset(DEVICE(s));
   1090         } else {
   1091             s->hw_cfg = (val & 0x003f300) | (s->hw_cfg & 0x4);
   1092         }
   1093         break;
   1094     case CSR_RX_DP_CTRL:
   1095         if (val & 0x80000000) {
   1096             /* Skip forward to next packet.  */
   1097             s->rxp_pad = 0;
   1098             s->rxp_offset = 0;
   1099             if (s->rxp_size == 0) {
   1100                 /* Pop a word to start the next packet.  */
   1101                 rx_fifo_pop(s);
   1102                 s->rxp_pad = 0;
   1103                 s->rxp_offset = 0;
   1104             }
   1105             s->rx_fifo_head += s->rxp_size;
   1106             if (s->rx_fifo_head >= s->rx_fifo_size) {
   1107                 s->rx_fifo_head -= s->rx_fifo_size;
   1108             }
   1109         }
   1110         break;
   1111     case CSR_PMT_CTRL:
   1112         if (val & 0x400) {
   1113             phy_reset(s);
   1114         }
   1115         s->pmt_ctrl &= ~0x34e;
   1116         s->pmt_ctrl |= (val & 0x34e);
   1117         break;
   1118     case CSR_GPIO_CFG:
   1119         /* Probably just enabling LEDs.  */
   1120         s->gpio_cfg = val & 0x7777071f;
   1121         break;
   1122     case CSR_GPT_CFG:
   1123         if ((s->gpt_cfg ^ val) & GPT_TIMER_EN) {
   1124             ptimer_transaction_begin(s->timer);
   1125             if (val & GPT_TIMER_EN) {
   1126                 ptimer_set_count(s->timer, val & 0xffff);
   1127                 ptimer_run(s->timer, 0);
   1128             } else {
   1129                 ptimer_stop(s->timer);
   1130                 ptimer_set_count(s->timer, 0xffff);
   1131             }
   1132             ptimer_transaction_commit(s->timer);
   1133         }
   1134         s->gpt_cfg = val & (GPT_TIMER_EN | 0xffff);
   1135         break;
   1136     case CSR_WORD_SWAP:
   1137         /* Ignored because we're in 32-bit mode.  */
   1138         s->word_swap = val;
   1139         break;
   1140     case CSR_MAC_CSR_CMD:
   1141         s->mac_cmd = val & 0x4000000f;
   1142         if (val & 0x80000000) {
   1143             if (val & 0x40000000) {
   1144                 s->mac_data = do_mac_read(s, val & 0xf);
   1145                 DPRINTF("MAC read %d = 0x%08x\n", val & 0xf, s->mac_data);
   1146             } else {
   1147                 DPRINTF("MAC write %d = 0x%08x\n", val & 0xf, s->mac_data);
   1148                 do_mac_write(s, val & 0xf, s->mac_data);
   1149             }
   1150         }
   1151         break;
   1152     case CSR_MAC_CSR_DATA:
   1153         s->mac_data = val;
   1154         break;
   1155     case CSR_AFC_CFG:
   1156         s->afc_cfg = val & 0x00ffffff;
   1157         break;
   1158     case CSR_E2P_CMD:
   1159         lan9118_eeprom_cmd(s, (val >> 28) & 7, val & 0x7f);
   1160         break;
   1161     case CSR_E2P_DATA:
   1162         s->e2p_data = val & 0xff;
   1163         break;
   1164 
   1165     default:
   1166         qemu_log_mask(LOG_GUEST_ERROR, "lan9118_write: Bad reg 0x%x = %x\n",
   1167                       (int)offset, (int)val);
   1168         break;
   1169     }
   1170     lan9118_update(s);
   1171 }
   1172 
   1173 static void lan9118_writew(void *opaque, hwaddr offset,
   1174                            uint32_t val)
   1175 {
   1176     lan9118_state *s = (lan9118_state *)opaque;
   1177     offset &= 0xff;
   1178 
   1179     if (s->write_word_prev_offset != (offset & ~0x3)) {
   1180         /* New offset, reset word counter */
   1181         s->write_word_n = 0;
   1182         s->write_word_prev_offset = offset & ~0x3;
   1183     }
   1184 
   1185     if (offset & 0x2) {
   1186         s->write_word_h = val;
   1187     } else {
   1188         s->write_word_l = val;
   1189     }
   1190 
   1191     //DPRINTF("Writew reg 0x%02x = 0x%08x\n", (int)offset, val);
   1192     s->write_word_n++;
   1193     if (s->write_word_n == 2) {
   1194         s->write_word_n = 0;
   1195         lan9118_writel(s, offset & ~3, s->write_word_l +
   1196                 (s->write_word_h << 16), 4);
   1197     }
   1198 }
   1199 
   1200 static void lan9118_16bit_mode_write(void *opaque, hwaddr offset,
   1201                                      uint64_t val, unsigned size)
   1202 {
   1203     switch (size) {
   1204     case 2:
   1205         lan9118_writew(opaque, offset, (uint32_t)val);
   1206         return;
   1207     case 4:
   1208         lan9118_writel(opaque, offset, val, size);
   1209         return;
   1210     }
   1211 
   1212     hw_error("lan9118_write: Bad size 0x%x\n", size);
   1213 }
   1214 
   1215 static uint64_t lan9118_readl(void *opaque, hwaddr offset,
   1216                               unsigned size)
   1217 {
   1218     lan9118_state *s = (lan9118_state *)opaque;
   1219 
   1220     //DPRINTF("Read reg 0x%02x\n", (int)offset);
   1221     if (offset <= RX_DATA_FIFO_PORT_LAST) {
   1222         /* RX FIFO */
   1223         return rx_fifo_pop(s);
   1224     }
   1225     switch (offset) {
   1226     case RX_STATUS_FIFO_PORT:
   1227         return rx_status_fifo_pop(s);
   1228     case RX_STATUS_FIFO_PEEK:
   1229         return s->rx_status_fifo[s->rx_status_fifo_head];
   1230     case TX_STATUS_FIFO_PORT:
   1231         return tx_status_fifo_pop(s);
   1232     case TX_STATUS_FIFO_PEEK:
   1233         return s->tx_status_fifo[s->tx_status_fifo_head];
   1234     case CSR_ID_REV:
   1235         return 0x01180001;
   1236     case CSR_IRQ_CFG:
   1237         return s->irq_cfg;
   1238     case CSR_INT_STS:
   1239         return s->int_sts;
   1240     case CSR_INT_EN:
   1241         return s->int_en;
   1242     case CSR_BYTE_TEST:
   1243         return 0x87654321;
   1244     case CSR_FIFO_INT:
   1245         return s->fifo_int;
   1246     case CSR_RX_CFG:
   1247         return s->rx_cfg;
   1248     case CSR_TX_CFG:
   1249         return s->tx_cfg;
   1250     case CSR_HW_CFG:
   1251         return s->hw_cfg;
   1252     case CSR_RX_DP_CTRL:
   1253         return 0;
   1254     case CSR_RX_FIFO_INF:
   1255         return (s->rx_status_fifo_used << 16) | (s->rx_fifo_used << 2);
   1256     case CSR_TX_FIFO_INF:
   1257         return (s->tx_status_fifo_used << 16)
   1258                | (s->tx_fifo_size - s->txp->fifo_used);
   1259     case CSR_PMT_CTRL:
   1260         return s->pmt_ctrl;
   1261     case CSR_GPIO_CFG:
   1262         return s->gpio_cfg;
   1263     case CSR_GPT_CFG:
   1264         return s->gpt_cfg;
   1265     case CSR_GPT_CNT:
   1266         return ptimer_get_count(s->timer);
   1267     case CSR_WORD_SWAP:
   1268         return s->word_swap;
   1269     case CSR_FREE_RUN:
   1270         return (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / 40) - s->free_timer_start;
   1271     case CSR_RX_DROP:
   1272         /* TODO: Implement dropped frames counter.  */
   1273         return 0;
   1274     case CSR_MAC_CSR_CMD:
   1275         return s->mac_cmd;
   1276     case CSR_MAC_CSR_DATA:
   1277         return s->mac_data;
   1278     case CSR_AFC_CFG:
   1279         return s->afc_cfg;
   1280     case CSR_E2P_CMD:
   1281         return s->e2p_cmd;
   1282     case CSR_E2P_DATA:
   1283         return s->e2p_data;
   1284     }
   1285     qemu_log_mask(LOG_GUEST_ERROR, "lan9118_read: Bad reg 0x%x\n", (int)offset);
   1286     return 0;
   1287 }
   1288 
   1289 static uint32_t lan9118_readw(void *opaque, hwaddr offset)
   1290 {
   1291     lan9118_state *s = (lan9118_state *)opaque;
   1292     uint32_t val;
   1293 
   1294     if (s->read_word_prev_offset != (offset & ~0x3)) {
   1295         /* New offset, reset word counter */
   1296         s->read_word_n = 0;
   1297         s->read_word_prev_offset = offset & ~0x3;
   1298     }
   1299 
   1300     s->read_word_n++;
   1301     if (s->read_word_n == 1) {
   1302         s->read_long = lan9118_readl(s, offset & ~3, 4);
   1303     } else {
   1304         s->read_word_n = 0;
   1305     }
   1306 
   1307     if (offset & 2) {
   1308         val = s->read_long >> 16;
   1309     } else {
   1310         val = s->read_long & 0xFFFF;
   1311     }
   1312 
   1313     //DPRINTF("Readw reg 0x%02x, val 0x%x\n", (int)offset, val);
   1314     return val;
   1315 }
   1316 
   1317 static uint64_t lan9118_16bit_mode_read(void *opaque, hwaddr offset,
   1318                                         unsigned size)
   1319 {
   1320     switch (size) {
   1321     case 2:
   1322         return lan9118_readw(opaque, offset);
   1323     case 4:
   1324         return lan9118_readl(opaque, offset, size);
   1325     }
   1326 
   1327     hw_error("lan9118_read: Bad size 0x%x\n", size);
   1328     return 0;
   1329 }
   1330 
   1331 static const MemoryRegionOps lan9118_mem_ops = {
   1332     .read = lan9118_readl,
   1333     .write = lan9118_writel,
   1334     .endianness = DEVICE_NATIVE_ENDIAN,
   1335 };
   1336 
   1337 static const MemoryRegionOps lan9118_16bit_mem_ops = {
   1338     .read = lan9118_16bit_mode_read,
   1339     .write = lan9118_16bit_mode_write,
   1340     .endianness = DEVICE_NATIVE_ENDIAN,
   1341 };
   1342 
   1343 static NetClientInfo net_lan9118_info = {
   1344     .type = NET_CLIENT_DRIVER_NIC,
   1345     .size = sizeof(NICState),
   1346     .receive = lan9118_receive,
   1347     .link_status_changed = lan9118_set_link,
   1348 };
   1349 
   1350 static void lan9118_realize(DeviceState *dev, Error **errp)
   1351 {
   1352     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
   1353     lan9118_state *s = LAN9118(dev);
   1354     int i;
   1355     const MemoryRegionOps *mem_ops =
   1356             s->mode_16bit ? &lan9118_16bit_mem_ops : &lan9118_mem_ops;
   1357 
   1358     memory_region_init_io(&s->mmio, OBJECT(dev), mem_ops, s,
   1359                           "lan9118-mmio", 0x100);
   1360     sysbus_init_mmio(sbd, &s->mmio);
   1361     sysbus_init_irq(sbd, &s->irq);
   1362     qemu_macaddr_default_if_unset(&s->conf.macaddr);
   1363 
   1364     s->nic = qemu_new_nic(&net_lan9118_info, &s->conf,
   1365                           object_get_typename(OBJECT(dev)), dev->id, s);
   1366     qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
   1367     s->eeprom[0] = 0xa5;
   1368     for (i = 0; i < 6; i++) {
   1369         s->eeprom[i + 1] = s->conf.macaddr.a[i];
   1370     }
   1371     s->pmt_ctrl = 1;
   1372     s->txp = &s->tx_packet;
   1373 
   1374     s->timer = ptimer_init(lan9118_tick, s, PTIMER_POLICY_LEGACY);
   1375     ptimer_transaction_begin(s->timer);
   1376     ptimer_set_freq(s->timer, 10000);
   1377     ptimer_set_limit(s->timer, 0xffff, 1);
   1378     ptimer_transaction_commit(s->timer);
   1379 }
   1380 
   1381 static Property lan9118_properties[] = {
   1382     DEFINE_NIC_PROPERTIES(lan9118_state, conf),
   1383     DEFINE_PROP_UINT32("mode_16bit", lan9118_state, mode_16bit, 0),
   1384     DEFINE_PROP_END_OF_LIST(),
   1385 };
   1386 
   1387 static void lan9118_class_init(ObjectClass *klass, void *data)
   1388 {
   1389     DeviceClass *dc = DEVICE_CLASS(klass);
   1390 
   1391     dc->reset = lan9118_reset;
   1392     device_class_set_props(dc, lan9118_properties);
   1393     dc->vmsd = &vmstate_lan9118;
   1394     dc->realize = lan9118_realize;
   1395 }
   1396 
   1397 static const TypeInfo lan9118_info = {
   1398     .name          = TYPE_LAN9118,
   1399     .parent        = TYPE_SYS_BUS_DEVICE,
   1400     .instance_size = sizeof(lan9118_state),
   1401     .class_init    = lan9118_class_init,
   1402 };
   1403 
   1404 static void lan9118_register_types(void)
   1405 {
   1406     type_register_static(&lan9118_info);
   1407 }
   1408 
   1409 /* Legacy helper function.  Should go away when machine config files are
   1410    implemented.  */
   1411 void lan9118_init(NICInfo *nd, uint32_t base, qemu_irq irq)
   1412 {
   1413     DeviceState *dev;
   1414     SysBusDevice *s;
   1415 
   1416     qemu_check_nic_model(nd, "lan9118");
   1417     dev = qdev_new(TYPE_LAN9118);
   1418     qdev_set_nic_properties(dev, nd);
   1419     s = SYS_BUS_DEVICE(dev);
   1420     sysbus_realize_and_unref(s, &error_fatal);
   1421     sysbus_mmio_map(s, 0, base);
   1422     sysbus_connect_irq(s, 0, irq);
   1423 }
   1424 
   1425 type_init(lan9118_register_types)