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 */