843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifndef _SYS_XNF_H
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define _SYS_XNF_H
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern "C" {
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
876de206688d9fe008ad80c116a23a56701579d1Richard Lowe#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGESIZE)
876de206688d9fe008ad80c116a23a56701579d1Richard Lowe#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGESIZE)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_MAXPKT 1500 /* MTU size */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_FRAMESIZE 1514 /* frame size including MAC header */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* DEBUG flags */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DEBUG_DDI 0x01
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DEBUG_TRACE 0x02
843e19887f64dde75055cf8842fc4db2171eff45johnlev
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson/*
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson * Information about each receive buffer and any transmit look-aside
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson * buffers.
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondsontypedef struct xnf_buf {
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson frtn_t free_rtn;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf *xnfp;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_dma_handle_t dma_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev caddr_t buf; /* DMA-able data buffer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev paddr_t buf_phys;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson mfn_t buf_mfn;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson size_t len;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson struct xnf_buf *next; /* For linking into free list */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_acc_handle_t acc_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_ref_t grant_ref; /* grant table reference */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint16_t id; /* buffer id */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson unsigned int gen;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson} xnf_buf_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson/*
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson * Information about each transmit buffer.
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondsontypedef struct xnf_txbuf {
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson struct xnf_txbuf *tx_next;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson mblk_t *tx_mp; /* mblk associated with packet */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson netif_tx_request_t tx_txreq;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson caddr_t tx_bufp;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson ddi_dma_handle_t tx_dma_handle;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson mfn_t tx_mfn;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson xnf_buf_t *tx_bdesc; /* Look-aside buffer, if used. */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson unsigned char tx_type;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson int16_t tx_status;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson RING_IDX tx_slot;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson#define TX_DATA 1
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson#define TX_MCAST_REQ 2
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson#define TX_MCAST_RSP 3
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson} xnf_txbuf_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson/*
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson * Information about each outstanding transmit operation.
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondsontypedef struct xnf_txid {
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint16_t id; /* Id of this transmit buffer. */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint16_t next; /* Freelist of ids. */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson xnf_txbuf_t *txbuf; /* Buffer details. */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson} xnf_txid_t;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson/*
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson * Per-instance data.
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson */
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef struct xnf {
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* most interesting stuff first to assist debugging */
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson dev_info_t *xnf_devinfo;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson mac_handle_t xnf_mh;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj unsigned char xnf_mac_addr[ETHERADDRL];
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson unsigned int xnf_gen; /* Increments on resume. */
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj boolean_t xnf_connected;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj boolean_t xnf_running;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson boolean_t xnf_be_rx_copy;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson boolean_t xnf_be_mcast_control;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_interrupts;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_unclaimed_interrupts;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_norxbuf;
a390c5f4ee8993a46df89076c9541e825984c3a5cz uint64_t xnf_stat_drop;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_errrx;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_tx_attempt;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_tx_pullup;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_tx_pagebndry;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_tx_defer;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_mac_rcv_error;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_runt;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_ipackets;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_opackets;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_rbytes;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_obytes;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_tx_cksum_deferred;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj uint64_t xnf_stat_rx_cksum_no_need;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_buf_allocated;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_buf_outstanding;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_gref_outstanding;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_gref_failure;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_gref_peak;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_rx_allocb_fail;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint64_t xnf_stat_rx_desballoc_fail;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kstat_t *xnf_kstat_aux;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj ddi_iblock_cookie_t xnf_icookie;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson netif_tx_front_ring_t xnf_tx_ring;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj ddi_dma_handle_t xnf_tx_ring_dma_handle;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj ddi_acc_handle_t xnf_tx_ring_dma_acchandle;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj paddr_t xnf_tx_ring_phys_addr;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj grant_ref_t xnf_tx_ring_ref;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson xnf_txid_t xnf_tx_pkt_id[NET_TX_RING_SIZE];
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint16_t xnf_tx_pkt_id_head;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kmutex_t xnf_txlock;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kmutex_t xnf_schedlock;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson boolean_t xnf_need_sched;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kcondvar_t xnf_cv_tx_slots;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kmem_cache_t *xnf_tx_buf_cache;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson netif_rx_front_ring_t xnf_rx_ring;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj ddi_dma_handle_t xnf_rx_ring_dma_handle;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj ddi_acc_handle_t xnf_rx_ring_dma_acchandle;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj paddr_t xnf_rx_ring_phys_addr;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj grant_ref_t xnf_rx_ring_ref;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson xnf_buf_t *xnf_rx_pkt_info[NET_RX_RING_SIZE];
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kmutex_t xnf_rxlock;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson mblk_t *xnf_rx_head;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson mblk_t *xnf_rx_tail;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson boolean_t xnf_rx_new_buffers_posted;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kmem_cache_t *xnf_buf_cache;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint16_t xnf_evtchn;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kmutex_t xnf_gref_lock;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson grant_ref_t xnf_gref_head;
551bc2a66868b5cb5be6b70ab9f55515e77a39a9mrj
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kcondvar_t xnf_cv_state;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson kcondvar_t xnf_cv_multicast;
565679070e884800f5d041d42d226813c0bbf6d8David Edmondson uint_t xnf_pending_multicast;
843e19887f64dde75055cf8842fc4db2171eff45johnlev} xnf_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* _SYS_XNF_H */