root/usr/src/uts/common/io/efe/efe.h
/*
 * Copyright (c) 2010 Steven Stallion.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     1. Redistributions of source code must retain the above copyright
 *        notice, this list of conditions and the following disclaimer.
 *     2. Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials provided
 *        with the distribution.
 *     3. Neither the name of the copyright owner nor the names of any
 *        contributors may be used to endorse or promote products derived
 *        from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _EFE_H
#define _EFE_H

#ifdef  __cplusplus
extern "C" {
#endif

#define VENDOR_ID               0x10B8
#define DEVICE_ID               0x0005

#define RESET_DELAY             1
#define RESET_TEST_CYCLES       16

#define STOP_DELAY              10
#define STOP_DELAY_CYCLES       160

#define MII_DELAY               1
#define MII_DELAY_CYCLES        16

#define EEPROM_DELAY            3
#define EEPROM_WORDSZ           16

#define AT93C46_ADDRLEN         6
#define AT93C56_ADDRLEN         8

#define FLAG_RUNNING            (1UL << 0)
#define FLAG_SUSPENDED          (1UL << 1)

#define MCHASHL                 64
#define MCHASHSZ                16

#define BURSTLEN                0x3F

#define RXDESCL                 128
#define TXDESCL                 128

#define BUFSZ                   1536

/*
 * Control/Status registers.
 */
#define CSR_COMMAND     0x00    /* Control Register */
#define CSR_INTSTAT     0x04    /* Interrupt Status Register */
#define CSR_INTMASK     0x08    /* Interrupt Mask Register */
#define CSR_GENCTL      0x0C    /* General Control Register */
#define CSR_NVCTL       0x10    /* Non-volatile Control Register */
#define CSR_EECTL       0x14    /* EEPROM Control Register */
#define CSR_PBLCNT      0x18    /* Programmable Burst Length Counter */
#define CSR_TEST        0x1C    /* Test Register */
#define CSR_CRCCNT      0x20    /* CRC Error Counter */
#define CSR_ALICNT      0x24    /* Frame Alignment Error Counter */
#define CSR_MPCNT       0x28    /* Missed Packet Counter */
#define CSR_RXFIFO      0x2C    /* Receive FIFO Contents */
#define CSR_MMCTL       0x30    /* MII Control Register */
#define CSR_MMDATA      0x34    /* MII Interface Register */
#define CSR_MMCFG       0x38    /* MII Configuration Register */
#define CSR_IPG         0x3C    /* Interpacket Gap Register */
#define CSR_LAN0        0x40    /* LAN Address Register 0 */
#define CSR_LAN1        0x44    /* LAN Address Register 1 */
#define CSR_LAN2        0x48    /* LAN Address Register 2 */
#define CSR_IDCHK       0x4C    /* Board ID/Checksum Register */
#define CSR_MC0         0x50    /* Multicast Address Register 0 */
#define CSR_MC1         0x54    /* Multicast Address Register 1 */
#define CSR_MC2         0x58    /* Multicast Address Register 2 */
#define CSR_MC3         0x5C    /* Multicast Address Register 3 */
#define CSR_RXCON       0x60    /* Receive Control Register */
#define CSR_RXSTAT      0x64    /* Receive Status Register */
#define CSR_RXCNT       0x68    /* Receive Byte Count */
#define CSR_RXTEST      0x6C    /* Receive Test */
#define CSR_TXCON       0x70    /* Transmit Control Register */
#define CSR_TXSTAT      0x74    /* Transmit Status Register */
#define CSR_TDPAR       0x78    /* Transmit Packet Address */
#define CSR_TXTEST      0x7C    /* Transmit Test */
#define CSR_PRFDAR      0x80    /* PCI Receive First Descriptor Address */
#define CSR_PRCDAR      0x84    /* PCI Receive Current Descriptor Address */
#define CSR_PRHDAR      0x88    /* PCI Receive Host Data Address */
#define CSR_PRFLAR      0x8C    /* PCI Receive Fragment List Address */
#define CSR_PRDLGTH     0x90    /* PCI Receive DMA Length/Control */
#define CSR_PRFCNT      0x94    /* PCI Receive Fragment Count */
#define CSR_PRLCAR      0x98    /* PCI Receive RAM Current Address */
#define CSR_PRLPAR      0x9C    /* PCI Receive RAM Packet Address */
#define CSR_PREFAR      0xA0    /* PCI Receive End of Frame Address */
#define CSR_PRSTAT      0xA4    /* PCI Receive DMA Status Register */
#define CSR_PRBUF       0xA8    /* Receive RAM Buffer */
#define CSR_RDNCAR      0xAC    /* Receive MTU Current Address */
#define CSR_PRCPTHR     0xB0    /* PCI Receive Copy Threshold Register */
#define CSR_ROMDATA     0xB4    /* ROMDATA */
#define CSR_PREEMPR     0xBC    /* Preemptive Interrupt */
#define CSR_PTFDAR      0xC0    /* PCI Transmit First Descriptor Address */
#define CSR_PTCDAR      0xC4    /* PCI Transmit Current Descriptor Address */
#define CSR_PTHDAR      0xC8    /* PCI Transmit Host Data Address */
#define CSR_PTFLAR      0xCC    /* PCI Transmit Fragment List Address */
#define CSR_PTDLGTH     0xD0    /* PCI Transmit DMA Length/Control */
#define CSR_PTFCNT      0xD4    /* PCI Transmit Fragment Count */
#define CSR_PTLCAR      0xD8    /* PCI Transmit RAM Current Address */
#define CSR_ETXTHR      0xDC    /* PCI Early Transmit Threshold Register */
#define CSR_PTETXC      0xE0    /* PCI Early Transmit Count */
#define CSR_PTSTAT      0xE4    /* PCI Transmit DMA Status */
#define CSR_PTBUF       0xE8    /* Transmit RAM Buffer */
#define CSR_PTFDAR2     0xEC    /* PCI Transmit 2 First Descriptor Address */
#define CSR_FEVTR       0xF0    /* CardBus (UNUSED) */
#define CSR_FEVTRMSKR   0xF4    /* CardBus (UNUSED) */
#define CSR_FPRSTSTR    0xF8    /* CardBus (UNUSED) */
#define CSR_FFRCEVTR    0xFF    /* CardBus (UNUSED) */

/*
 * Register fields.
 */
#define COMMAND_STOP_RX         (1UL << 0)      /* Stop Receiver */
#define COMMAND_START_RX        (1UL << 1)      /* Start Receiver */
#define COMMAND_TXQUEUED        (1UL << 2)      /* Queue TX Descriptor */
#define COMMAND_RXQUEUED        (1UL << 3)      /* Queue RX Descriptor */
#define COMMAND_NEXTFRAME       (1UL << 4)      /* Release RX Frame */
#define COMMAND_STOP_TDMA       (1UL << 5)      /* Stop TX DMA */
#define COMMAND_STOP_RDMA       (1UL << 6)      /* Stop RX DMA */
#define COMMAND_TXUGO           (1UL << 7)      /* Restart Transmission */

#define INTSTAT_RCC     (1UL << 0)      /* Receive Copy Complete */
#define INTSTAT_HCC     (1UL << 1)      /* Header Copy Complete */
#define INTSTAT_RQE     (1UL << 2)      /* Receive Queue Empty */
#define INTSTAT_OVW     (1UL << 3)      /* Receive Overflow */
#define INTSTAT_RXE     (1UL << 4)      /* Receive Error */
#define INTSTAT_TXC     (1UL << 5)      /* Transmit Complete */
#define INTSTAT_TCC     (1UL << 6)      /* Transmit Chain Complete */
#define INTSTAT_TQE     (1UL << 7)      /* Transmit Queue Empty */
#define INTSTAT_TXU     (1UL << 8)      /* Transmit Underrun */
#define INTSTAT_CNT     (1UL << 9)      /* Counter Overflow */
#define INTSTAT_PREI    (1UL << 10)     /* Preemptive Interrupt */
#define INTSTAT_RCT     (1UL << 11)     /* Receive Copy Threshold */
#define INTSTAT_FATAL   (1UL << 12)     /* Fatal Error */
#define INTSTAT_PME     (1UL << 14)     /* Power Management Event */
#define INTSTAT_GP2     (1UL << 15)     /* GPIO Event */
#define INTSTAT_ACTV    (1UL << 16)     /* Interrupt Active */
#define INTSTAT_RXIDLE  (1UL << 17)     /* Receive Idle */
#define INTSTAT_TXIDLE  (1UL << 18)     /* Transmit Idle */
#define INTSTAT_RCIP    (1UL << 19)     /* Receive Copy in Progress */
#define INTSTAT_TCIP    (1UL << 20)     /* Transmit Copy in Progress */
#define INTSTAT_RBE     (1UL << 21)     /* Receive Buffers Empty */
#define INTSTAT_RCTS    (1UL << 22)     /* Receive Copy Threshold Status */
#define INTSTAT_RSV     (1UL << 23)     /* Receive Status Valid */
#define INTSTAT_DPE     (1UL << 24)     /* PCI Data Parity Error */
#define INTSTAT_APE     (1UL << 25)     /* PCI Address Parity Error */
#define INTSTAT_PMA     (1UL << 26)     /* PCI Master Abort */
#define INTSTAT_PTA     (1UL << 27)     /* PCI Target Abort */

#define INTMASK_RCC     (1UL << 0)      /* Receive Copy Complete */
#define INTMASK_HCC     (1UL << 1)      /* Header Copy Complete */
#define INTMASK_RQE     (1UL << 2)      /* Receive Queue Empty */
#define INTMASK_OVW     (1UL << 3)      /* Receive Overflow */
#define INTMASK_RXE     (1UL << 4)      /* Receive Error */
#define INTMASK_TXC     (1UL << 5)      /* Transmit Complete */
#define INTMASK_TCC     (1UL << 6)      /* Transmit Chain Complete */
#define INTMASK_TQE     (1UL << 7)      /* Transmit Queue Empty */
#define INTMASK_TXU     (1UL << 8)      /* Transmit Underrun */
#define INTMASK_CNT     (1UL << 9)      /* Counter Overflow */
#define INTMASK_PREI    (1UL << 10)     /* Preemptive Interrupt */
#define INTMASK_RCT     (1UL << 11)     /* Receive Copy Threshold */
#define INTMASK_FATAL   (1UL << 12)     /* Fatal Error */
#define INTMASK_PME     (1UL << 14)     /* Power Management Event */
#define INTMASK_GP2     (1UL << 15)     /* GPIO Event */

#define GENCTL_RESET    (1UL << 0)      /* Soft Reset */
#define GENCTL_INT      (1UL << 1)      /* Interrupt Enable */
#define GENCTL_SWINT    (1UL << 2)      /* Software Interrupt */
#define GENCTL_PWRDWN   (1UL << 3)      /* Power Down */
#define GENCTL_ONECOPY  (1UL << 4)      /* One Copy per Receive Frame */
#define GENCTL_BE       (1UL << 5)      /* Big Endian */
#define GENCTL_RDP      (1UL << 6)      /* Receive DMA Priority */
#define GENCTL_TDP      (1UL << 7)      /* Transmit DMA Priority */
#define GENCTL_RFT_32   (0UL << 8)      /* Receive FIFO Threshold (1/4) */
#define GENCTL_RFT_64   (1UL << 8)      /* Receive FIFO Threshold (1/2) */
#define GENCTL_RFT_96   (2UL << 8)      /* Receive FIFO Threshold (3/4) */
#define GENCTL_RFT_128  (3UL << 8)      /* Receive FIFO Threshold (FULL) */
#define GENCTL_MRM      (1UL << 10)     /* Memory Read Multiple */
#define GENCTL_MRL      (1UL << 11)     /* Memory Read Line */
#define GENCTL_SOFT0    (1UL << 12)     /* Software Bit 0 */
#define GENCTL_SOFT1    (1UL << 13)     /* Software Bit 1 */
#define GENCTL_RSTPHY   (1UL << 14)     /* PHY Reset */
#define GENCTL_SCLK     (1UL << 16)     /* System Clock */
#define GENCTL_RD       (1UL << 17)     /* Reset Disable */
#define GENCTL_MPE      (1UL << 18)     /* Magic Packet Enable */
#define GENCTL_PME      (1UL << 19)     /* PME Interrupt Enable */
#define GENCTL_PS_00    (0UL << 20)     /* Power State "00" */
#define GENCTL_PS_01    (1UL << 20)     /* Power State "01" */
#define GENCTL_PS_10    (2UL << 20)     /* Power State "10" */
#define GENCTL_PS_11    (3UL << 20)     /* Power State "11" */
#define GENCTL_OPLE     (1UL << 22)     /* On Power Loss Enable */

#define NVCTL_EMM       (1UL << 0)      /* Enable Memory Map */
#define NVCTL_CRS       (1UL << 1)      /* Clock Run Supported */
#define NVCTL_GPOE1     (1UL << 2)      /* General Purpose Output Enable 1 */
#define NVCTL_GPOE2     (1UL << 3)      /* General Purpose Output Enable 2 */
#define NVCTL_GPIO1     (1UL << 4)      /* General Purpose I/O 1 */
#define NVCTL_GPIO2     (1UL << 5)      /* General Purpose I/O 2 */
#define NVCTL_CB_MODE   (1UL << 6)      /* CardBus (UNUSED) */
#define NVCTL_IPG_DLY   7               /* Inter-packet Gap Timer Delay */

#define EECTL_ENABLE    (1UL << 0)      /* EEPROM Enable */
#define EECTL_EECS      (1UL << 1)      /* EEPROM Chip Select */
#define EECTL_EESK      (1UL << 2)      /* EEPROM Clock */
#define EECTL_EEDI      (1UL << 3)      /* EEPROM Data Input */
#define EECTL_EEDO      (1UL << 4)      /* EEPROM Data Output */
#define EECTL_EERDY     (1UL << 5)      /* EEPROM Ready */
#define EECTL_SIZE      (1UL << 6)      /* EEPROM Size */

#define TEST_CLOCK      (1UL << 3)      /* Clock Test */

#define MMCTL_READ      (1UL << 0)      /* MII Read */
#define MMCTL_WRITE     (1UL << 1)      /* MII Write */
#define MMCTL_RESPONDER (1UL << 3)      /* MII Responder */
#define MMCTL_PHYREG    4               /* PHY Address */
#define MMCTL_PHYADDR   9               /* PHY Register Address */

#define MMCFG_SME       (1UL << 0)      /* Serial Mode Enable */
#define MMCFG_EN694     (1UL << 1)      /* EN694 Pin */
#define MMCFG_694LNK    (1UL << 2)      /* 694LNK Pin */
#define MMCFG_PHY       (1UL << 3)      /* PHY Present */
#define MMCFG_SMI       (1UL << 4)      /* Enable Serial Management */
#define MMCFG_ALTCS     (1UL << 5)      /* Alternate Clock Source */
#define MMCFG_ALTDATA   (1UL << 6)      /* Alternate Data */
#define MMCFG_STXC      (1UL << 14)     /* Select TX Clock */
#define MMCFG_SNTXC     (1UL << 15)     /* Set No TX Clock */

#define RXCON_SEP       (1UL << 0)      /* Save Errored Packets */
#define RXCON_RRF       (1UL << 1)      /* Receive Runt Frames */
#define RXCON_RBF       (1UL << 2)      /* Receive Broadcast Frames */
#define RXCON_RMF       (1UL << 3)      /* Receive Multicast Frames */
#define RXCON_RIIA      (1UL << 4)      /* Receive Inverse Addresses */
#define RXCON_PROMISC   (1UL << 5)      /* Promiscuous Mode */
#define RXCON_MONITOR   (1UL << 6)      /* Monitor Mode */
#define RXCON_ERE       (1UL << 7)      /* Early Receive Enable */
#define RXCON_EB_INT    (0UL << 8)      /* External Buffer (Inernal) */
#define RXCON_EB_16K    (1UL << 8)      /* External Buffer (16K) */
#define RXCON_EB_32K    (2UL << 8)      /* External Buffer (32K) */
#define RXCON_EB_128K   (3UL << 8)      /* External Buffer (128K) */

#define RXSTAT_PRI      (1UL << 0)      /* Packet Received Intact */
#define RXSTAT_FAE      (1UL << 1)      /* Frame Alignment Error */
#define RXSTAT_CRC      (1UL << 2)      /* CRC Error */
#define RXSTAT_MP       (1UL << 3)      /* Missed Packet */
#define RXSTAT_MAR      (1UL << 4)      /* Multicast Address Recognized */
#define RXSTAT_BAR      (1UL << 5)      /* Broadcast Address Recognized */
#define RXSTAT_RD       (1UL << 6)      /* Receiver Disabled */
#define RXSTAT_NSV      (1UL << 12)     /* Network Status Valid */
#define RXSTAT_FLE      (1UL << 13)     /* Fragment List Error */
#define RXSTAT_HC       (1UL << 14)     /* Header Copied */
#define RXSTAT_OWNER    (1UL << 15)     /* Descriptor Ownership Bit */

#define RXCTL_FRAGLIST  (1UL << 0)      /* Fragment List */
#define RXCTL_LFFORM    (1UL << 1)      /* Fragment List Format */
#define RXCTL_HEADER    (1UL << 2)      /* Header Copy */

#define TXCON_ETE       (1UL << 0)      /* Early Transmit Enable */
#define TXCON_LB_0      (0UL << 1)      /* Normal Operation */
#define TXCON_LB_1      (1UL << 1)      /* Internal Loopback */
#define TXCON_LB_2      (2UL << 1)      /* External Loopback */
#define TXCON_LB_3      (3UL << 1)      /* Full Duplex Mode */
#define TXCON_SLOT      3               /* Slot Time */

#define TXSTAT_PTX      (1UL << 0)      /* Packet Transmitted */
#define TXSTAT_ND       (1UL << 1)      /* Non-deferred Transmission */
#define TXSTAT_COLL     (1UL << 2)      /* Transmitted w/Collisions */
#define TXSTAT_CSL      (1UL << 3)      /* Carrier Sense Lost */
#define TXSTAT_UFLO     (1UL << 4)      /* TX Underrun */
#define TXSTAT_CDH      (1UL << 5)      /* Collision Detect Heartbeat */
#define TXSTAT_OWC      (1UL << 6)      /* Out of Window Collision */
#define TXSTAT_DEFER    (1UL << 7)      /* IGP Deferring */
#define TXSTAT_CCNT     8               /* Collision Count */
#define TXSTAT_CCNTMASK 0x1F            /* Collision Count Mask */
#define TXSTAT_EXCOLL   (1UL << 12)     /* Excessive Collisions */
#define TXSTAT_OWNER    (1UL << 15)     /* Descriptor Ownership Bit */

#define TXCTL_FRAGLIST  (1UL << 0)      /* Fragment List */
#define TXCTL_LFFORM    (1UL << 1)      /* Fragment List Format */
#define TXCTL_IAF       (1UL << 2)      /* Interrupt After Frame */
#define TXCTL_NOCRC     (1UL << 3)      /* Disable CRC Generation */
#define TXCTL_LASTDESCR (1UL << 4)      /* Last Transmit Descriptor */

/*
 * Register access.
 */
#define GETCSR(efep, reg) \
        ddi_get32((efep)->efe_regs_acch, \
            (efep)->efe_regs + ((reg) / sizeof (uint32_t)))

#define PUTCSR(efep, reg, val) \
        ddi_put32((efep)->efe_regs_acch, \
            (efep)->efe_regs + ((reg) / sizeof (uint32_t)), (val))

#define CLRBIT(efep, reg, bit) \
        PUTCSR(efep, reg, (GETCSR(efep, reg) & ~(bit)))

#define SETBIT(efep, reg, bit) \
        PUTCSR(efep, reg, (GETCSR(efep, reg) | (bit)))

/*
 * DMA access.
 */
#define DESCSZ(x)               (sizeof (efe_desc_t) * (x))
#define BUFPSZ(x)               (sizeof (efe_buf_t *) * (x))

#define DESCADDR(rp, x)         ((rp)->r_dmac.dmac_address + DESCSZ(x))
#define DESCLEN(rp)             ((rp)->r_len)

#define BUFADDR(bp)             ((bp)->b_dmac.dmac_address)
#define BUFLEN(bp)              ((bp)->b_len)

#define NEXTDESC(rp, x)         (((x) + 1) % (rp)->r_len)
#define NEXTDESCADDR(rp, x)     DESCADDR(rp, NEXTDESC(rp, x))

#define GETDESC(rp, x)          (&(rp)->r_descp[(x)])

#define GETDESC16(rp, addr) \
        ddi_get16((rp)->r_acch, (addr))

#define PUTDESC16(rp, addr, val) \
        ddi_put16((rp)->r_acch, (addr), (val))

#define GETDESC32(rp, addr) \
        ddi_get32((rp)->r_acch, (addr))

#define PUTDESC32(rp, addr, val) \
        ddi_put32((rp)->r_acch, (addr), (val))

#define SYNCDESC(rp, x, type) \
        (void) ddi_dma_sync((rp)->r_dmah, DESCSZ(x), \
            sizeof (efe_desc_t), (type))

#define GETBUF(rp, x)           ((rp)->r_bufpp[(x)])

#define SYNCBUF(bp, type) \
        (void) ddi_dma_sync((bp)->b_dmah, 0, (bp)->b_len, (type))

/*
 * Soft state.
 */
typedef struct {
        uint16_t                d_status;
        uint16_t                d_len;
        uint32_t                d_bufaddr;
        uint16_t                d_buflen;
        uint16_t                d_control;
        uint32_t                d_next;
} efe_desc_t;

typedef struct {
        ddi_dma_handle_t        b_dmah;
        ddi_acc_handle_t        b_acch;
        ddi_dma_cookie_t        b_dmac;
        size_t                  b_len;
        caddr_t                 b_kaddr;
} efe_buf_t;

typedef struct {
        ddi_dma_handle_t        r_dmah;
        ddi_acc_handle_t        r_acch;
        ddi_dma_cookie_t        r_dmac;
        size_t                  r_len;
        efe_desc_t              *r_descp;
        efe_buf_t               **r_bufpp;
} efe_ring_t;

typedef struct {
        dev_info_t              *efe_dip;

        mii_handle_t            efe_miih;
        mac_handle_t            efe_mh;

        uint32_t                *efe_regs;
        ddi_acc_handle_t        efe_regs_acch;

        ddi_intr_handle_t       efe_intrh;

        kmutex_t                efe_intrlock;
        kmutex_t                efe_txlock;

        int                     efe_flags;
        boolean_t               efe_promisc;

        uint8_t                 efe_macaddr[ETHERADDRL];

        uint_t                  efe_mccount[MCHASHL];
        uint16_t                efe_mchash[MCHASHL / MCHASHSZ];

        efe_ring_t              *efe_rx_ring;
        uint_t                  efe_rx_desc;

        efe_ring_t              *efe_tx_ring;
        uint_t                  efe_tx_desc;
        uint_t                  efe_tx_sent;

        /*
         * Driver statistics.
         */
        uint64_t                efe_multircv;
        uint64_t                efe_brdcstrcv;
        uint64_t                efe_multixmt;
        uint64_t                efe_brdcstxmt;
        uint64_t                efe_norcvbuf;
        uint64_t                efe_ierrors;
        uint64_t                efe_noxmtbuf;
        uint64_t                efe_oerrors;
        uint64_t                efe_collisions;
        uint64_t                efe_rbytes;
        uint64_t                efe_ipackets;
        uint64_t                efe_obytes;
        uint64_t                efe_opackets;
        uint64_t                efe_uflo;
        uint64_t                efe_oflo;
        uint64_t                efe_align_errors;
        uint64_t                efe_fcs_errors;
        uint64_t                efe_first_collisions;
        uint64_t                efe_tx_late_collisions;
        uint64_t                efe_defer_xmts;
        uint64_t                efe_ex_collisions;
        uint64_t                efe_macxmt_errors;
        uint64_t                efe_carrier_errors;
        uint64_t                efe_toolong_errors;
        uint64_t                efe_macrcv_errors;
        uint64_t                efe_runt_errors;
        uint64_t                efe_jabber_errors;
} efe_t;

#ifdef  __cplusplus
}
#endif

#endif  /* _EFE_H */