root/sys/dev/nfe/if_nfevar.h
/*      $OpenBSD: if_nfevar.h,v 1.11 2006/02/19 13:57:02 damien Exp $   */

/*-
 * Copyright (c) 2005 Jonathan Gray <jsg@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

struct nfe_tx_data {
        bus_dmamap_t    tx_data_map;
        struct mbuf     *m;
};

struct nfe_tx_ring {
        bus_dma_tag_t           tx_desc_tag;
        bus_dmamap_t            tx_desc_map;
        bus_addr_t              physaddr;
        struct nfe_desc32       *desc32;
        struct nfe_desc64       *desc64;
        bus_dma_tag_t           tx_data_tag;
        struct nfe_tx_data      data[NFE_TX_RING_COUNT];
        int                     queued;
        int                     cur;
        int                     next;
};

struct nfe_rx_data {
        bus_dmamap_t    rx_data_map;
        bus_addr_t      paddr;
        struct mbuf     *m;
};

struct nfe_rx_ring {
        bus_dma_tag_t           rx_desc_tag;
        bus_dmamap_t            rx_desc_map;
        bus_addr_t              physaddr;
        struct nfe_desc32       *desc32;
        struct nfe_desc64       *desc64;
        bus_dma_tag_t           rx_data_tag;
        bus_dmamap_t            rx_spare_map;
        struct nfe_rx_data      data[NFE_RX_RING_COUNT];
        int                     cur;
        int                     next;
};

struct nfe_jrx_ring {
        bus_dma_tag_t           jrx_desc_tag;
        bus_dmamap_t            jrx_desc_map;
        bus_dma_tag_t           jrx_jumbo_tag;
        bus_dmamap_t            jrx_jumbo_map;
        bus_addr_t              jphysaddr;
        struct nfe_desc32       *jdesc32;
        struct nfe_desc64       *jdesc64;
        bus_dma_tag_t           jrx_data_tag;
        bus_dmamap_t            jrx_spare_map;
        struct nfe_rx_data      jdata[NFE_JUMBO_RX_RING_COUNT];
        int                     jcur;
        int                     jnext;
};

struct nfe_hw_stats {
        uint64_t                rx_octets;
        uint32_t                rx_frame_errors;
        uint32_t                rx_extra_bytes;
        uint32_t                rx_late_cols;
        uint32_t                rx_runts;
        uint32_t                rx_jumbos;
        uint32_t                rx_fifo_overuns;
        uint32_t                rx_crc_errors;
        uint32_t                rx_fae;
        uint32_t                rx_len_errors;
        uint32_t                rx_unicast;
        uint32_t                rx_multicast;
        uint32_t                rx_broadcast;
        uint32_t                rx_pause;
        uint32_t                rx_drops;
        uint64_t                tx_octets;
        uint32_t                tx_zero_rexmits;
        uint32_t                tx_one_rexmits;
        uint32_t                tx_multi_rexmits;
        uint32_t                tx_late_cols;
        uint32_t                tx_fifo_underuns;
        uint32_t                tx_carrier_losts;
        uint32_t                tx_excess_deferals;
        uint32_t                tx_retry_errors;
        uint32_t                tx_deferals;
        uint32_t                tx_frames;
        uint32_t                tx_pause;
        uint32_t                tx_unicast;
        uint32_t                tx_multicast;
        uint32_t                tx_broadcast;
};

struct nfe_softc {
        if_t                    nfe_ifp;
        device_t                nfe_dev;
        uint16_t                nfe_devid;
        uint16_t                nfe_revid;
        device_t                nfe_miibus;
        struct mtx              nfe_mtx;
        struct resource         *nfe_res[1];
        struct resource         *nfe_msix_res;
        struct resource         *nfe_msix_pba_res;
        struct resource         *nfe_irq[NFE_MSI_MESSAGES];
        void                    *nfe_intrhand[NFE_MSI_MESSAGES];
        struct callout          nfe_stat_ch;
        int                     nfe_watchdog_timer;

        bus_dma_tag_t           nfe_parent_tag;

        int                     nfe_if_flags;
        uint32_t                nfe_flags;
#define NFE_JUMBO_SUP           0x0001
#define NFE_40BIT_ADDR          0x0002
#define NFE_HW_CSUM             0x0004
#define NFE_HW_VLAN             0x0008
#define NFE_PWR_MGMT            0x0010
#define NFE_CORRECT_MACADDR     0x0020
#define NFE_TX_FLOW_CTRL        0x0040
#define NFE_MIB_V1              0x0080
#define NFE_MIB_V2              0x0100
#define NFE_MIB_V3              0x0200
        int                     nfe_jumbo_disable;
        uint32_t                rxtxctl;
        uint8_t                 mii_phyaddr;
        uint8_t                 eaddr[ETHER_ADDR_LEN];
        struct nfe_hw_stats     nfe_stats;
        struct taskqueue        *nfe_tq;
        struct task             nfe_int_task;
        int                     nfe_link;
        int                     nfe_suspended;
        int                     nfe_framesize;
        int                     nfe_process_limit;
        int                     nfe_force_tx;
        uint32_t                nfe_irq_status;
        uint32_t                nfe_irq_mask;
        uint32_t                nfe_intrs;
        uint32_t                nfe_nointrs;
        uint32_t                nfe_msi;
        uint32_t                nfe_msix;

        struct nfe_tx_ring      txq;
        struct nfe_rx_ring      rxq;
        struct nfe_jrx_ring     jrxq;
};

struct nfe_type {
        uint16_t        vid_id;
        uint16_t        dev_id;
        char            *name;
};