1eb1e7c3eSFabien Chouteau /* 2eb1e7c3eSFabien Chouteau * QEMU Freescale eTSEC Emulator 3eb1e7c3eSFabien Chouteau * 4eb1e7c3eSFabien Chouteau * Copyright (c) 2011-2013 AdaCore 5eb1e7c3eSFabien Chouteau * 6eb1e7c3eSFabien Chouteau * Permission is hereby granted, free of charge, to any person obtaining a copy 7eb1e7c3eSFabien Chouteau * of this software and associated documentation files (the "Software"), to deal 8eb1e7c3eSFabien Chouteau * in the Software without restriction, including without limitation the rights 9eb1e7c3eSFabien Chouteau * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10eb1e7c3eSFabien Chouteau * copies of the Software, and to permit persons to whom the Software is 11eb1e7c3eSFabien Chouteau * furnished to do so, subject to the following conditions: 12eb1e7c3eSFabien Chouteau * 13eb1e7c3eSFabien Chouteau * The above copyright notice and this permission notice shall be included in 14eb1e7c3eSFabien Chouteau * all copies or substantial portions of the Software. 15eb1e7c3eSFabien Chouteau * 16eb1e7c3eSFabien Chouteau * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17eb1e7c3eSFabien Chouteau * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18eb1e7c3eSFabien Chouteau * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19eb1e7c3eSFabien Chouteau * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20eb1e7c3eSFabien Chouteau * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21eb1e7c3eSFabien Chouteau * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22eb1e7c3eSFabien Chouteau * THE SOFTWARE. 23eb1e7c3eSFabien Chouteau */ 242a6a4076SMarkus Armbruster 252a6a4076SMarkus Armbruster #ifndef ETSEC_H 262a6a4076SMarkus Armbruster #define ETSEC_H 27eb1e7c3eSFabien Chouteau 28eb1e7c3eSFabien Chouteau #include "hw/sysbus.h" 29eb1e7c3eSFabien Chouteau #include "net/net.h" 30eb1e7c3eSFabien Chouteau #include "hw/ptimer.h" 31db1015e9SEduardo Habkost #include "qom/object.h" 32eb1e7c3eSFabien Chouteau 33eb1e7c3eSFabien Chouteau /* Buffer Descriptors */ 34eb1e7c3eSFabien Chouteau 35eb1e7c3eSFabien Chouteau typedef struct eTSEC_rxtx_bd { 36eb1e7c3eSFabien Chouteau uint16_t flags; 37eb1e7c3eSFabien Chouteau uint16_t length; 38eb1e7c3eSFabien Chouteau uint32_t bufptr; 39eb1e7c3eSFabien Chouteau } eTSEC_rxtx_bd; 40eb1e7c3eSFabien Chouteau 41eb1e7c3eSFabien Chouteau #define BD_WRAP (1 << 13) 42eb1e7c3eSFabien Chouteau #define BD_INTERRUPT (1 << 12) 43eb1e7c3eSFabien Chouteau #define BD_LAST (1 << 11) 44eb1e7c3eSFabien Chouteau 45eb1e7c3eSFabien Chouteau #define BD_TX_READY (1 << 15) 46eb1e7c3eSFabien Chouteau #define BD_TX_PADCRC (1 << 14) 47eb1e7c3eSFabien Chouteau #define BD_TX_TC (1 << 10) 48eb1e7c3eSFabien Chouteau #define BD_TX_PREDEF (1 << 9) 49eb1e7c3eSFabien Chouteau #define BD_TX_HFELC (1 << 7) 50eb1e7c3eSFabien Chouteau #define BD_TX_CFRL (1 << 6) 51eb1e7c3eSFabien Chouteau #define BD_TX_RC_MASK 0xF 52eb1e7c3eSFabien Chouteau #define BD_TX_RC_OFFSET 0x2 53eb1e7c3eSFabien Chouteau #define BD_TX_TOEUN (1 << 1) 54eb1e7c3eSFabien Chouteau #define BD_TX_TR (1 << 0) 55eb1e7c3eSFabien Chouteau 56eb1e7c3eSFabien Chouteau #define BD_RX_EMPTY (1 << 15) 57eb1e7c3eSFabien Chouteau #define BD_RX_RO1 (1 << 14) 58eb1e7c3eSFabien Chouteau #define BD_RX_FIRST (1 << 10) 59eb1e7c3eSFabien Chouteau #define BD_RX_MISS (1 << 8) 60eb1e7c3eSFabien Chouteau #define BD_RX_BROADCAST (1 << 7) 61eb1e7c3eSFabien Chouteau #define BD_RX_MULTICAST (1 << 6) 62eb1e7c3eSFabien Chouteau #define BD_RX_LG (1 << 5) 63eb1e7c3eSFabien Chouteau #define BD_RX_NO (1 << 4) 64eb1e7c3eSFabien Chouteau #define BD_RX_SH (1 << 3) 65eb1e7c3eSFabien Chouteau #define BD_RX_CR (1 << 2) 66eb1e7c3eSFabien Chouteau #define BD_RX_OV (1 << 1) 67eb1e7c3eSFabien Chouteau #define BD_RX_TR (1 << 0) 68eb1e7c3eSFabien Chouteau 69eb1e7c3eSFabien Chouteau /* Tx FCB flags */ 70eb1e7c3eSFabien Chouteau #define FCB_TX_VLN (1 << 7) 71eb1e7c3eSFabien Chouteau #define FCB_TX_IP (1 << 6) 72eb1e7c3eSFabien Chouteau #define FCB_TX_IP6 (1 << 5) 73eb1e7c3eSFabien Chouteau #define FCB_TX_TUP (1 << 4) 74eb1e7c3eSFabien Chouteau #define FCB_TX_UDP (1 << 3) 75eb1e7c3eSFabien Chouteau #define FCB_TX_CIP (1 << 2) 76eb1e7c3eSFabien Chouteau #define FCB_TX_CTU (1 << 1) 77eb1e7c3eSFabien Chouteau #define FCB_TX_NPH (1 << 0) 78eb1e7c3eSFabien Chouteau 79eb1e7c3eSFabien Chouteau /* eTSEC */ 80eb1e7c3eSFabien Chouteau 81eb1e7c3eSFabien Chouteau /* Number of register in the device */ 82eb1e7c3eSFabien Chouteau #define ETSEC_REG_NUMBER 1024 83eb1e7c3eSFabien Chouteau 84eb1e7c3eSFabien Chouteau typedef struct eTSEC_Register { 85eb1e7c3eSFabien Chouteau const char *name; 86eb1e7c3eSFabien Chouteau const char *desc; 87eb1e7c3eSFabien Chouteau uint32_t access; 88eb1e7c3eSFabien Chouteau uint32_t value; 89eb1e7c3eSFabien Chouteau } eTSEC_Register; 90eb1e7c3eSFabien Chouteau 91db1015e9SEduardo Habkost struct eTSEC { 92eb1e7c3eSFabien Chouteau SysBusDevice busdev; 93eb1e7c3eSFabien Chouteau 94eb1e7c3eSFabien Chouteau MemoryRegion io_area; 95eb1e7c3eSFabien Chouteau 96eb1e7c3eSFabien Chouteau eTSEC_Register regs[ETSEC_REG_NUMBER]; 97eb1e7c3eSFabien Chouteau 98eb1e7c3eSFabien Chouteau NICState *nic; 99eb1e7c3eSFabien Chouteau NICConf conf; 100eb1e7c3eSFabien Chouteau 101eb1e7c3eSFabien Chouteau /* Tx */ 102eb1e7c3eSFabien Chouteau 103eb1e7c3eSFabien Chouteau uint8_t *tx_buffer; 104eb1e7c3eSFabien Chouteau uint32_t tx_buffer_len; 105eb1e7c3eSFabien Chouteau eTSEC_rxtx_bd first_bd; 106eb1e7c3eSFabien Chouteau 107eb1e7c3eSFabien Chouteau /* Rx */ 108eb1e7c3eSFabien Chouteau 109eb1e7c3eSFabien Chouteau uint8_t *rx_buffer; 110eb1e7c3eSFabien Chouteau uint32_t rx_buffer_len; 111eb1e7c3eSFabien Chouteau uint32_t rx_remaining_data; 112eb1e7c3eSFabien Chouteau uint8_t rx_first_in_frame; 113eb1e7c3eSFabien Chouteau uint8_t rx_fcb_size; 114eb1e7c3eSFabien Chouteau eTSEC_rxtx_bd rx_first_bd; 115eb1e7c3eSFabien Chouteau uint8_t rx_fcb[10]; 116eb1e7c3eSFabien Chouteau uint32_t rx_padding; 117eb1e7c3eSFabien Chouteau 118eb1e7c3eSFabien Chouteau /* IRQs */ 119eb1e7c3eSFabien Chouteau qemu_irq tx_irq; 120eb1e7c3eSFabien Chouteau qemu_irq rx_irq; 121eb1e7c3eSFabien Chouteau qemu_irq err_irq; 122eb1e7c3eSFabien Chouteau 123eb1e7c3eSFabien Chouteau 124eb1e7c3eSFabien Chouteau uint16_t phy_status; 125eb1e7c3eSFabien Chouteau uint16_t phy_control; 126eb1e7c3eSFabien Chouteau 127eb1e7c3eSFabien Chouteau /* Polling */ 128eb1e7c3eSFabien Chouteau struct ptimer_state *ptimer; 129eb1e7c3eSFabien Chouteau 130575bafd1SFam Zheng /* Whether we should flush the rx queue when buffer becomes available. */ 131575bafd1SFam Zheng bool need_flush; 132db1015e9SEduardo Habkost }; 133db1015e9SEduardo Habkost typedef struct eTSEC eTSEC; 134eb1e7c3eSFabien Chouteau 135eb1e7c3eSFabien Chouteau #define TYPE_ETSEC_COMMON "eTSEC" 136*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(eTSEC, ETSEC_COMMON) 137eb1e7c3eSFabien Chouteau 138eb1e7c3eSFabien Chouteau #define eTSEC_TRANSMIT 1 139eb1e7c3eSFabien Chouteau #define eTSEC_RECEIVE 2 140eb1e7c3eSFabien Chouteau 141fd8e3381SMichael Davidsaver void etsec_update_irq(eTSEC *etsec); 142fd8e3381SMichael Davidsaver 143eb1e7c3eSFabien Chouteau void etsec_walk_tx_ring(eTSEC *etsec, int ring_nbr); 144eb1e7c3eSFabien Chouteau void etsec_walk_rx_ring(eTSEC *etsec, int ring_nbr); 145b6cb6610SFam Zheng ssize_t etsec_rx_ring_write(eTSEC *etsec, const uint8_t *buf, size_t size); 146eb1e7c3eSFabien Chouteau 147eb1e7c3eSFabien Chouteau void etsec_write_miim(eTSEC *etsec, 148eb1e7c3eSFabien Chouteau eTSEC_Register *reg, 149eb1e7c3eSFabien Chouteau uint32_t reg_index, 150eb1e7c3eSFabien Chouteau uint32_t value); 151eb1e7c3eSFabien Chouteau 152eb1e7c3eSFabien Chouteau void etsec_miim_link_status(eTSEC *etsec, NetClientState *nc); 153eb1e7c3eSFabien Chouteau 1542a6a4076SMarkus Armbruster #endif /* ETSEC_H */ 155