Home | History | Annotate | Download | only in io
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef _SYS_XNF_H
     28 #define	_SYS_XNF_H
     29 
     30 #ifdef __cplusplus
     31 extern "C" {
     32 #endif
     33 
     34 #define	NET_TX_RING_SIZE  __RING_SIZE((netif_tx_sring_t *)0, PAGESIZE)
     35 #define	NET_RX_RING_SIZE  __RING_SIZE((netif_rx_sring_t *)0, PAGESIZE)
     36 
     37 #define	XNF_MAXPKT	1500		/* MTU size */
     38 #define	XNF_FRAMESIZE	1514		/* frame size including MAC header */
     39 
     40 /* DEBUG flags */
     41 #define	XNF_DEBUG_DDI		0x01
     42 #define	XNF_DEBUG_TRACE		0x02
     43 
     44 /*
     45  * Information about each receive buffer and any transmit look-aside
     46  * buffers.
     47  */
     48 typedef struct xnf_buf {
     49 	frtn_t			free_rtn;
     50 	struct xnf		*xnfp;
     51 	ddi_dma_handle_t	dma_handle;
     52 	caddr_t			buf;		/* DMA-able data buffer */
     53 	paddr_t			buf_phys;
     54 	mfn_t			buf_mfn;
     55 	size_t			len;
     56 	struct xnf_buf		*next;	/* For linking into free list */
     57 	ddi_acc_handle_t	acc_handle;
     58 	grant_ref_t		grant_ref;	/* grant table reference */
     59 	uint16_t		id;		/* buffer id */
     60 	unsigned int		gen;
     61 } xnf_buf_t;
     62 
     63 /*
     64  * Information about each transmit buffer.
     65  */
     66 typedef struct xnf_txbuf {
     67 	struct xnf_txbuf	*tx_next;
     68 	mblk_t			*tx_mp;	/* mblk associated with packet */
     69 	netif_tx_request_t	tx_txreq;
     70 	caddr_t			tx_bufp;
     71 	ddi_dma_handle_t	tx_dma_handle;
     72 	mfn_t			tx_mfn;
     73 	xnf_buf_t		*tx_bdesc; /* Look-aside buffer, if used. */
     74 	unsigned char		tx_type;
     75 	int16_t			tx_status;
     76 	RING_IDX		tx_slot;
     77 
     78 #define	TX_DATA		1
     79 #define	TX_MCAST_REQ	2
     80 #define	TX_MCAST_RSP	3
     81 } xnf_txbuf_t;
     82 
     83 /*
     84  * Information about each outstanding transmit operation.
     85  */
     86 typedef struct xnf_txid {
     87 	uint16_t	id;	/* Id of this transmit buffer. */
     88 	uint16_t	next;	/* Freelist of ids. */
     89 	xnf_txbuf_t	*txbuf;	/* Buffer details. */
     90 } xnf_txid_t;
     91 
     92 /*
     93  * Per-instance data.
     94  */
     95 typedef struct xnf {
     96 	/* most interesting stuff first to assist debugging */
     97 	dev_info_t		*xnf_devinfo;
     98 	mac_handle_t		xnf_mh;
     99 	unsigned char		xnf_mac_addr[ETHERADDRL];
    100 
    101 	unsigned int		xnf_gen;	/* Increments on resume. */
    102 
    103 	boolean_t		xnf_connected;
    104 	boolean_t		xnf_running;
    105 
    106 	boolean_t		xnf_be_rx_copy;
    107 	boolean_t		xnf_be_mcast_control;
    108 
    109 	uint64_t		xnf_stat_interrupts;
    110 	uint64_t		xnf_stat_unclaimed_interrupts;
    111 	uint64_t		xnf_stat_norxbuf;
    112 	uint64_t		xnf_stat_drop;
    113 	uint64_t		xnf_stat_errrx;
    114 
    115 	uint64_t		xnf_stat_tx_attempt;
    116 	uint64_t		xnf_stat_tx_pullup;
    117 	uint64_t		xnf_stat_tx_pagebndry;
    118 	uint64_t		xnf_stat_tx_defer;
    119 	uint64_t		xnf_stat_mac_rcv_error;
    120 	uint64_t		xnf_stat_runt;
    121 
    122 	uint64_t		xnf_stat_ipackets;
    123 	uint64_t		xnf_stat_opackets;
    124 	uint64_t		xnf_stat_rbytes;
    125 	uint64_t		xnf_stat_obytes;
    126 
    127 	uint64_t		xnf_stat_tx_cksum_deferred;
    128 	uint64_t		xnf_stat_rx_cksum_no_need;
    129 
    130 	uint64_t		xnf_stat_buf_allocated;
    131 	uint64_t		xnf_stat_buf_outstanding;
    132 	uint64_t		xnf_stat_gref_outstanding;
    133 	uint64_t		xnf_stat_gref_failure;
    134 	uint64_t		xnf_stat_gref_peak;
    135 	uint64_t		xnf_stat_rx_allocb_fail;
    136 	uint64_t		xnf_stat_rx_desballoc_fail;
    137 
    138 	kstat_t			*xnf_kstat_aux;
    139 
    140 	ddi_iblock_cookie_t	xnf_icookie;
    141 
    142 	netif_tx_front_ring_t	xnf_tx_ring;
    143 	ddi_dma_handle_t	xnf_tx_ring_dma_handle;
    144 	ddi_acc_handle_t	xnf_tx_ring_dma_acchandle;
    145 	paddr_t			xnf_tx_ring_phys_addr;
    146 	grant_ref_t		xnf_tx_ring_ref;
    147 
    148 	xnf_txid_t		xnf_tx_pkt_id[NET_TX_RING_SIZE];
    149 	uint16_t		xnf_tx_pkt_id_head;
    150 	kmutex_t		xnf_txlock;
    151 	kmutex_t		xnf_schedlock;
    152 	boolean_t		xnf_need_sched;
    153 	kcondvar_t		xnf_cv_tx_slots;
    154 	kmem_cache_t		*xnf_tx_buf_cache;
    155 
    156 	netif_rx_front_ring_t	xnf_rx_ring;
    157 	ddi_dma_handle_t	xnf_rx_ring_dma_handle;
    158 	ddi_acc_handle_t	xnf_rx_ring_dma_acchandle;
    159 	paddr_t			xnf_rx_ring_phys_addr;
    160 	grant_ref_t		xnf_rx_ring_ref;
    161 
    162 	xnf_buf_t		*xnf_rx_pkt_info[NET_RX_RING_SIZE];
    163 	kmutex_t		xnf_rxlock;
    164 	mblk_t			*xnf_rx_head;
    165 	mblk_t			*xnf_rx_tail;
    166 	boolean_t		xnf_rx_new_buffers_posted;
    167 	kmem_cache_t		*xnf_buf_cache;
    168 
    169 	uint16_t		xnf_evtchn;
    170 
    171 	kmutex_t		xnf_gref_lock;
    172 	grant_ref_t		xnf_gref_head;
    173 
    174 	kcondvar_t		xnf_cv_state;
    175 	kcondvar_t		xnf_cv_multicast;
    176 	uint_t			xnf_pending_multicast;
    177 } xnf_t;
    178 
    179 #ifdef __cplusplus
    180 }
    181 #endif
    182 
    183 #endif	/* _SYS_XNF_H */
    184