xnf.h revision 843e19887f64dde75055cf8842fc4db2171eff45
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/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright 2007 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#pragma ident "%Z%%M% %I% %E% SMI"
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/types.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/kstat.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/hypervisor.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <xen/public/io/netif.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <xen/sys/xenbus_impl.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern "C" {
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define NET_TX_RING_SIZE __RING_SIZE((netif_tx_sring_t *)0, PAGESIZE)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define NET_RX_RING_SIZE __RING_SIZE((netif_rx_sring_t *)0, PAGESIZE)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_MAXPKT 1500 /* MTU size */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_FRAMESIZE 1514 /* frame size including MAC header */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_MAX_RXDESCS 256
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Watermark for causing "interrupt on completion" for outgoing packets */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_TX_FREE_THRESH (NET_TX_RING_SIZE / 10)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define MCAST_HASHBITS 256
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xnf_diagnose; /* Available for use any time. */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Flags to set in the global xnf_diagnose */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DIAG_RX 0x01
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DIAG_TX 0x02
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DIAG_STATS 0x04
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DIAG_RX_BUFS 0x08
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* DEBUG flags */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DEBUG_DDI 0x01
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DEBUG_TRACE 0x02
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DEBUG_SEND 0x04
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DEBUG_INT 0x08
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNF_DESC_ALIGN 8
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Info pertaining to each xmit/receive buffer */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstruct xnf_buffer_desc {
843e19887f64dde75055cf8842fc4db2171eff45johnlev frtn_t free_rtn; /* desballoc() structure */
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf *xnfp;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_dma_handle_t dma_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev caddr_t buf; /* DMA-able data buffer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev paddr_t buf_phys;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf_buffer_desc *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 */
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Various information about each transmit packet */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstruct tx_pktinfo {
843e19887f64dde75055cf8842fc4db2171eff45johnlev mblk_t *mp; /* mblk associated with packet */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_dma_handle_t dma_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf_buffer_desc *bdesc; /* pointer to buffer descriptor */
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_ref_t grant_ref; /* grant table reference */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint16_t id; /* tx pkt id/free list next pointer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Per network-interface-controller driver private structure */
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef struct xnf {
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* most interesting stuff first to assist debugging */
843e19887f64dde75055cf8842fc4db2171eff45johnlev dev_info_t *devinfo; /* System per-device info. */
843e19887f64dde75055cf8842fc4db2171eff45johnlev mac_handle_t mh; /* Nemo per-device info. */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int rx_bufs_outstanding;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int tx_descs_free;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int rx_descs_free; /* count of free rx bufs */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int n_xmits; /* No. xmit descriptors */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int n_recvs; /* No. recv descriptors */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int n_recv_bufs; /* No. recv DMA buffers */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int tx_start_thresh_regval;
843e19887f64dde75055cf8842fc4db2171eff45johnlev unsigned char mac_addr[ETHERADDRL];
843e19887f64dde75055cf8842fc4db2171eff45johnlev int max_recv_bufs;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int recv_buffer_count;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int xmit_buffer_count;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev boolean_t connected;
843e19887f64dde75055cf8842fc4db2171eff45johnlev boolean_t running;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev boolean_t cksum_offload;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_intr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_norcvbuf;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_errrcv;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_xmit_attempt;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_xmit_pullup;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_xmit_pagebndry;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_xmit_defer;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_rx_no_ringbuf;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_mac_rcv_error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_runt;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_ipackets;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_opackets;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_rbytes;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_obytes;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_tx_cksum_deferred;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t stat_rx_cksum_no_need;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev kstat_t *kstat_aux;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf_buffer_desc *free_list;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf_buffer_desc *xmit_free_list;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int tx_pkt_id_list; /* free list of avail pkt ids */
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct tx_pktinfo tx_pkt_info[NET_TX_RING_SIZE];
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xnf_buffer_desc *rxpkt_bufptr[XNF_MAX_RXDESCS];
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev mac_resource_handle_t rx_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_iblock_cookie_t icookie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmutex_t tx_buf_mutex;
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmutex_t rx_buf_mutex;
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmutex_t txlock;
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmutex_t intrlock;
843e19887f64dde75055cf8842fc4db2171eff45johnlev boolean_t tx_pages_readonly;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev netif_tx_front_ring_t tx_ring; /* tx interface struct ptr */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_dma_handle_t tx_ring_dma_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_acc_handle_t tx_ring_dma_acchandle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev paddr_t tx_ring_phys_addr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_ref_t tx_ring_ref;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev netif_rx_front_ring_t rx_ring; /* rx interface struct ptr */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_dma_handle_t rx_ring_dma_handle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_acc_handle_t rx_ring_dma_acchandle;
843e19887f64dde75055cf8842fc4db2171eff45johnlev paddr_t rx_ring_phys_addr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_ref_t rx_ring_ref;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint16_t evtchn; /* channel to back end ctlr */
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_ref_t gref_tx_head; /* tx grant free list */
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_ref_t gref_rx_head; /* rx grant free list */
843e19887f64dde75055cf8842fc4db2171eff45johnlev kcondvar_t cv;
843e19887f64dde75055cf8842fc4db2171eff45johnlev} xnf_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* _SYS_XNF_H */