1843e1988Sjohnlev /* 2843e1988Sjohnlev * CDDL HEADER START 3843e1988Sjohnlev * 4843e1988Sjohnlev * The contents of this file are subject to the terms of the 5843e1988Sjohnlev * Common Development and Distribution License (the "License"). 6843e1988Sjohnlev * You may not use this file except in compliance with the License. 7843e1988Sjohnlev * 8843e1988Sjohnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9843e1988Sjohnlev * or http://www.opensolaris.org/os/licensing. 10843e1988Sjohnlev * See the License for the specific language governing permissions 11843e1988Sjohnlev * and limitations under the License. 12843e1988Sjohnlev * 13843e1988Sjohnlev * When distributing Covered Code, include this CDDL HEADER in each 14843e1988Sjohnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15843e1988Sjohnlev * If applicable, add the following below this CDDL HEADER, with the 16843e1988Sjohnlev * fields enclosed by brackets "[]" replaced with your own identifying 17843e1988Sjohnlev * information: Portions Copyright [yyyy] [name of copyright owner] 18843e1988Sjohnlev * 19843e1988Sjohnlev * CDDL HEADER END 20843e1988Sjohnlev */ 21843e1988Sjohnlev 22843e1988Sjohnlev /* 2356567907SDavid Edmondson * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24843e1988Sjohnlev * Use is subject to license terms. 25843e1988Sjohnlev */ 26843e1988Sjohnlev 27*9276b399SYuri Pankov /* 28*9276b399SYuri Pankov * Copyright (c) 2014, 2017 by Delphix. All rights reserved. 29*9276b399SYuri Pankov */ 30*9276b399SYuri Pankov 31843e1988Sjohnlev #ifndef _SYS_XNF_H 32843e1988Sjohnlev #define _SYS_XNF_H 33843e1988Sjohnlev 34843e1988Sjohnlev #ifdef __cplusplus 35843e1988Sjohnlev extern "C" { 36843e1988Sjohnlev #endif 37843e1988Sjohnlev 38*9276b399SYuri Pankov /* 39*9276b399SYuri Pankov * As of April 2017, TX and RX ring sizes are fixed to 1 page in 40*9276b399SYuri Pankov * size and Xen doesn't support changing it. 41*9276b399SYuri Pankov * This represents 256 entries. 42*9276b399SYuri Pankov */ 43876de206SRichard Lowe #define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGESIZE) 44876de206SRichard Lowe #define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGESIZE) 45843e1988Sjohnlev 46*9276b399SYuri Pankov /* 47*9276b399SYuri Pankov * There is no MTU limit, however for all practical purposes hardware won't 48*9276b399SYuri Pankov * support anything much larger than 9k. We put an arbitrary 16k limit. 49*9276b399SYuri Pankov */ 50*9276b399SYuri Pankov #define XNF_MAXPKT 16384 51843e1988Sjohnlev #define XNF_FRAMESIZE 1514 /* frame size including MAC header */ 52843e1988Sjohnlev 53*9276b399SYuri Pankov /* 54*9276b399SYuri Pankov * Based on XEN_NETIF_NR_SLOTS_MIN in Linux. Packets that span more pages 55*9276b399SYuri Pankov * than this must be defragmented or dropped. 56*9276b399SYuri Pankov */ 57*9276b399SYuri Pankov #define XEN_MAX_TX_DATA_PAGES 18 58*9276b399SYuri Pankov /* 59*9276b399SYuri Pankov * We keep one extra slot for LSO 60*9276b399SYuri Pankov */ 61*9276b399SYuri Pankov #define XEN_MAX_SLOTS_PER_TX (XEN_MAX_TX_DATA_PAGES + 1) 62*9276b399SYuri Pankov 63*9276b399SYuri Pankov #define XEN_DATA_BOUNDARY 0x1000 64*9276b399SYuri Pankov 6556567907SDavid Edmondson /* 6656567907SDavid Edmondson * Information about each receive buffer and any transmit look-aside 6756567907SDavid Edmondson * buffers. 6856567907SDavid Edmondson */ 6956567907SDavid Edmondson typedef struct xnf_buf { 7056567907SDavid Edmondson frtn_t free_rtn; 71843e1988Sjohnlev struct xnf *xnfp; 72843e1988Sjohnlev ddi_dma_handle_t dma_handle; 73843e1988Sjohnlev caddr_t buf; /* DMA-able data buffer */ 74843e1988Sjohnlev paddr_t buf_phys; 7556567907SDavid Edmondson mfn_t buf_mfn; 7656567907SDavid Edmondson size_t len; 7756567907SDavid Edmondson struct xnf_buf *next; /* For linking into free list */ 78843e1988Sjohnlev ddi_acc_handle_t acc_handle; 79843e1988Sjohnlev grant_ref_t grant_ref; /* grant table reference */ 80843e1988Sjohnlev uint16_t id; /* buffer id */ 8156567907SDavid Edmondson unsigned int gen; 8256567907SDavid Edmondson } xnf_buf_t; 83843e1988Sjohnlev 8456567907SDavid Edmondson /* 8556567907SDavid Edmondson * Information about each transmit buffer. 8656567907SDavid Edmondson */ 87*9276b399SYuri Pankov typedef enum xnf_txbuf_type { 88*9276b399SYuri Pankov TX_DATA = 1, 89*9276b399SYuri Pankov TX_MCAST_REQ, 90*9276b399SYuri Pankov TX_MCAST_RSP 91*9276b399SYuri Pankov } xnf_txbuf_type_t; 92*9276b399SYuri Pankov 93*9276b399SYuri Pankov /* 94*9276b399SYuri Pankov * A xnf_txbuf is used to store ancillary data for a netif_tx_request_t. 95*9276b399SYuri Pankov * A tx packet can span multiple xnf_txbuf's, linked together through tx_next 96*9276b399SYuri Pankov * and tx_prev; tx_head points to the head of the chain. 97*9276b399SYuri Pankov */ 9856567907SDavid Edmondson typedef struct xnf_txbuf { 9956567907SDavid Edmondson struct xnf_txbuf *tx_next; 100*9276b399SYuri Pankov struct xnf_txbuf *tx_prev; 101*9276b399SYuri Pankov struct xnf_txbuf *tx_head; 102*9276b399SYuri Pankov xnf_txbuf_type_t tx_type; 10356567907SDavid Edmondson netif_tx_request_t tx_txreq; 104*9276b399SYuri Pankov netif_extra_info_t tx_extra; 105*9276b399SYuri Pankov /* Used for TX_DATA types */ 10656567907SDavid Edmondson ddi_dma_handle_t tx_dma_handle; 107*9276b399SYuri Pankov boolean_t tx_handle_bound; 108*9276b399SYuri Pankov mblk_t *tx_mp; 10956567907SDavid Edmondson xnf_buf_t *tx_bdesc; /* Look-aside buffer, if used. */ 110*9276b399SYuri Pankov int tx_frags_to_ack; 111*9276b399SYuri Pankov /* Used for TX_MCAST types */ 11256567907SDavid Edmondson int16_t tx_status; 113*9276b399SYuri Pankov /* Used for debugging */ 114*9276b399SYuri Pankov mfn_t tx_mfn; 11556567907SDavid Edmondson RING_IDX tx_slot; 11656567907SDavid Edmondson } xnf_txbuf_t; 117843e1988Sjohnlev 118*9276b399SYuri Pankov #define TXBUF_SETNEXT(head, next) \ 119*9276b399SYuri Pankov head->tx_next = next; \ 120*9276b399SYuri Pankov next->tx_prev = head; 121*9276b399SYuri Pankov 12256567907SDavid Edmondson /* 12356567907SDavid Edmondson * Information about each outstanding transmit operation. 12456567907SDavid Edmondson */ 12556567907SDavid Edmondson typedef struct xnf_txid { 12656567907SDavid Edmondson uint16_t id; /* Id of this transmit buffer. */ 12756567907SDavid Edmondson uint16_t next; /* Freelist of ids. */ 12856567907SDavid Edmondson xnf_txbuf_t *txbuf; /* Buffer details. */ 12956567907SDavid Edmondson } xnf_txid_t; 13056567907SDavid Edmondson 13156567907SDavid Edmondson /* 13256567907SDavid Edmondson * Per-instance data. 13356567907SDavid Edmondson */ 134843e1988Sjohnlev typedef struct xnf { 135843e1988Sjohnlev /* most interesting stuff first to assist debugging */ 13656567907SDavid Edmondson dev_info_t *xnf_devinfo; 13756567907SDavid Edmondson mac_handle_t xnf_mh; 138551bc2a6Smrj unsigned char xnf_mac_addr[ETHERADDRL]; 139*9276b399SYuri Pankov uint32_t xnf_mtu; 14056567907SDavid Edmondson 14156567907SDavid Edmondson unsigned int xnf_gen; /* Increments on resume. */ 142551bc2a6Smrj 143551bc2a6Smrj boolean_t xnf_connected; 144551bc2a6Smrj boolean_t xnf_running; 145551bc2a6Smrj 14656567907SDavid Edmondson boolean_t xnf_be_rx_copy; 14756567907SDavid Edmondson boolean_t xnf_be_mcast_control; 148*9276b399SYuri Pankov boolean_t xnf_be_tx_sg; 149*9276b399SYuri Pankov boolean_t xnf_be_lso; 150551bc2a6Smrj 151551bc2a6Smrj uint64_t xnf_stat_interrupts; 152551bc2a6Smrj uint64_t xnf_stat_unclaimed_interrupts; 153551bc2a6Smrj uint64_t xnf_stat_norxbuf; 154*9276b399SYuri Pankov uint64_t xnf_stat_rx_drop; 155551bc2a6Smrj uint64_t xnf_stat_errrx; 156551bc2a6Smrj 157551bc2a6Smrj uint64_t xnf_stat_tx_pullup; 158*9276b399SYuri Pankov uint64_t xnf_stat_tx_lookaside; 159551bc2a6Smrj uint64_t xnf_stat_tx_defer; 160*9276b399SYuri Pankov uint64_t xnf_stat_tx_drop; 161*9276b399SYuri Pankov uint64_t xnf_stat_tx_eth_hdr_split; 162551bc2a6Smrj uint64_t xnf_stat_mac_rcv_error; 163551bc2a6Smrj uint64_t xnf_stat_runt; 164551bc2a6Smrj 165551bc2a6Smrj uint64_t xnf_stat_ipackets; 166551bc2a6Smrj uint64_t xnf_stat_opackets; 167551bc2a6Smrj uint64_t xnf_stat_rbytes; 168551bc2a6Smrj uint64_t xnf_stat_obytes; 169551bc2a6Smrj 170551bc2a6Smrj uint64_t xnf_stat_tx_cksum_deferred; 171551bc2a6Smrj uint64_t xnf_stat_rx_cksum_no_need; 172551bc2a6Smrj 17356567907SDavid Edmondson uint64_t xnf_stat_buf_allocated; 17456567907SDavid Edmondson uint64_t xnf_stat_buf_outstanding; 17556567907SDavid Edmondson uint64_t xnf_stat_gref_outstanding; 17656567907SDavid Edmondson uint64_t xnf_stat_gref_failure; 17756567907SDavid Edmondson uint64_t xnf_stat_gref_peak; 17856567907SDavid Edmondson uint64_t xnf_stat_rx_allocb_fail; 17956567907SDavid Edmondson uint64_t xnf_stat_rx_desballoc_fail; 180551bc2a6Smrj 18156567907SDavid Edmondson kstat_t *xnf_kstat_aux; 182551bc2a6Smrj 183551bc2a6Smrj ddi_iblock_cookie_t xnf_icookie; 184551bc2a6Smrj 18556567907SDavid Edmondson netif_tx_front_ring_t xnf_tx_ring; 186551bc2a6Smrj ddi_dma_handle_t xnf_tx_ring_dma_handle; 187551bc2a6Smrj ddi_acc_handle_t xnf_tx_ring_dma_acchandle; 188551bc2a6Smrj paddr_t xnf_tx_ring_phys_addr; 189551bc2a6Smrj grant_ref_t xnf_tx_ring_ref; 190551bc2a6Smrj 191*9276b399SYuri Pankov xnf_txid_t *xnf_tx_pkt_id; 19256567907SDavid Edmondson uint16_t xnf_tx_pkt_id_head; 19356567907SDavid Edmondson kmutex_t xnf_txlock; 19456567907SDavid Edmondson kmutex_t xnf_schedlock; 19556567907SDavid Edmondson boolean_t xnf_need_sched; 19656567907SDavid Edmondson kcondvar_t xnf_cv_tx_slots; 19756567907SDavid Edmondson kmem_cache_t *xnf_tx_buf_cache; 19856567907SDavid Edmondson 19956567907SDavid Edmondson netif_rx_front_ring_t xnf_rx_ring; 200551bc2a6Smrj ddi_dma_handle_t xnf_rx_ring_dma_handle; 201551bc2a6Smrj ddi_acc_handle_t xnf_rx_ring_dma_acchandle; 202551bc2a6Smrj paddr_t xnf_rx_ring_phys_addr; 203551bc2a6Smrj grant_ref_t xnf_rx_ring_ref; 204551bc2a6Smrj 205*9276b399SYuri Pankov xnf_buf_t **xnf_rx_pkt_info; 20656567907SDavid Edmondson kmutex_t xnf_rxlock; 20756567907SDavid Edmondson mblk_t *xnf_rx_head; 20856567907SDavid Edmondson mblk_t *xnf_rx_tail; 20956567907SDavid Edmondson boolean_t xnf_rx_new_buffers_posted; 21056567907SDavid Edmondson kmem_cache_t *xnf_buf_cache; 21156567907SDavid Edmondson 21256567907SDavid Edmondson uint16_t xnf_evtchn; 21356567907SDavid Edmondson 21456567907SDavid Edmondson kmutex_t xnf_gref_lock; 21556567907SDavid Edmondson grant_ref_t xnf_gref_head; 216551bc2a6Smrj 21756567907SDavid Edmondson kcondvar_t xnf_cv_state; 21856567907SDavid Edmondson kcondvar_t xnf_cv_multicast; 21956567907SDavid Edmondson uint_t xnf_pending_multicast; 220843e1988Sjohnlev } xnf_t; 221843e1988Sjohnlev 222843e1988Sjohnlev #ifdef __cplusplus 223843e1988Sjohnlev } 224843e1988Sjohnlev #endif 225843e1988Sjohnlev 226843e1988Sjohnlev #endif /* _SYS_XNF_H */ 227