/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_XNF_H
#define	_SYS_XNF_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef __cplusplus
extern "C" {
#endif

#define	NET_TX_RING_SIZE  __RING_SIZE((netif_tx_sring_t *)0, PAGESIZE)
#define	NET_RX_RING_SIZE  __RING_SIZE((netif_rx_sring_t *)0, PAGESIZE)

#define	XNF_MAXPKT	1500		/* MTU size */
#define	XNF_FRAMESIZE	1514		/* frame size including MAC header */

#define	XNF_MAX_RXDESCS	256

/* Watermark for causing "interrupt on completion" for outgoing packets */
#define	XNF_TX_FREE_THRESH	(NET_TX_RING_SIZE / 10)

#define	MCAST_HASHBITS		256

extern int	xnf_diagnose;	/* Available for use any time. */

/* Flags to set in the global xnf_diagnose */
#define	XNF_DIAG_RX		0x01
#define	XNF_DIAG_TX		0x02
#define	XNF_DIAG_STATS		0x04
#define	XNF_DIAG_RX_BUFS	0x08

/* DEBUG flags */
#define	XNF_DEBUG_DDI		0x01
#define	XNF_DEBUG_TRACE		0x02
#define	XNF_DEBUG_SEND		0x04
#define	XNF_DEBUG_INT		0x08

#define	XNF_DESC_ALIGN		8


/* Info pertaining to each xmit/receive buffer */
struct xnf_buffer_desc {
	frtn_t			free_rtn;	/* desballoc() structure */
	struct xnf		*xnfp;
	ddi_dma_handle_t	dma_handle;
	caddr_t			buf;		/* DMA-able data buffer */
	paddr_t			buf_phys;
	struct xnf_buffer_desc	*next;	/* For linking into free list */
	ddi_acc_handle_t	acc_handle;
	grant_ref_t		grant_ref;	/* grant table reference */
	uint16_t		id;		/* buffer id */
};

/* Various information about each transmit packet */
struct tx_pktinfo {
	mblk_t			*mp;	/* mblk associated with packet */
	ddi_dma_handle_t	dma_handle;
	struct xnf_buffer_desc	*bdesc; /* pointer to buffer descriptor */
	grant_ref_t		grant_ref;	/* grant table reference */
	uint16_t		id;	/* tx pkt id/free list next pointer */
};

/* Per network-interface-controller driver private structure */
typedef struct xnf {
	/* most interesting stuff first to assist debugging */
	dev_info_t		*xnf_devinfo;	/* System per-device info. */
	mac_handle_t		xnf_mh;		/* Nemo per-device info. */
	int			xnf_rx_bufs_outstanding;
	int			xnf_tx_descs_free;
	int			xnf_rx_descs_free; /* count of free rx bufs */
	int			xnf_n_tx;	/* No. xmit descriptors */
	int			xnf_n_rx;	/* No. recv descriptors */
	int			xnf_n_rx_bufs;	/* No. recv DMA buffers */
	int			xnf_tx_start_thresh_regval;
	unsigned char		xnf_mac_addr[ETHERADDRL];
	int			xnf_max_rx_bufs;
	int			xnf_rx_buffer_count;
	int			xnf_tx_buffer_count;

	boolean_t		xnf_connected;
	boolean_t		xnf_running;

	boolean_t		xnf_cksum_offload;

	uint64_t		xnf_stat_interrupts;
	uint64_t		xnf_stat_unclaimed_interrupts;
	uint64_t		xnf_stat_norxbuf;
	uint64_t		xnf_stat_drop;
	uint64_t		xnf_stat_errrx;

	uint64_t		xnf_stat_tx_attempt;
	uint64_t		xnf_stat_tx_pullup;
	uint64_t		xnf_stat_tx_pagebndry;
	uint64_t		xnf_stat_tx_defer;
	uint64_t		xnf_stat_rx_no_ringbuf;
	uint64_t		xnf_stat_mac_rcv_error;
	uint64_t		xnf_stat_runt;

	uint64_t		xnf_stat_ipackets;
	uint64_t		xnf_stat_opackets;
	uint64_t		xnf_stat_rbytes;
	uint64_t		xnf_stat_obytes;

	uint64_t		xnf_stat_tx_cksum_deferred;
	uint64_t		xnf_stat_rx_cksum_no_need;
	uint64_t		xnf_stat_hvcopy_enabled; /* on/off */
	uint64_t		xnf_stat_hvcopy_packet_processed;

	kstat_t			*xnf_kstat_aux;

	struct xnf_buffer_desc	*xnf_free_list;
	struct xnf_buffer_desc	*xnf_tx_free_list;
	int			xnf_tx_pkt_id_list;
				/* free list of avail pkt ids */
	struct tx_pktinfo	xnf_tx_pkt_info[NET_TX_RING_SIZE];
	struct xnf_buffer_desc	*xnf_rxpkt_bufptr[XNF_MAX_RXDESCS];

	mac_resource_handle_t	xnf_rx_handle;
	ddi_iblock_cookie_t	xnf_icookie;
	kmutex_t		xnf_tx_buf_mutex;
	kmutex_t		xnf_rx_buf_mutex;
	kmutex_t		xnf_txlock;
	kmutex_t		xnf_intrlock;
	boolean_t		xnf_tx_pages_readonly;

	netif_tx_front_ring_t	xnf_tx_ring;	/* tx interface struct ptr */
	ddi_dma_handle_t	xnf_tx_ring_dma_handle;
	ddi_acc_handle_t	xnf_tx_ring_dma_acchandle;
	paddr_t			xnf_tx_ring_phys_addr;
	grant_ref_t		xnf_tx_ring_ref;

	netif_rx_front_ring_t	xnf_rx_ring;	/* rx interface struct ptr */
	ddi_dma_handle_t	xnf_rx_ring_dma_handle;
	ddi_acc_handle_t	xnf_rx_ring_dma_acchandle;
	paddr_t			xnf_rx_ring_phys_addr;
	grant_ref_t		xnf_rx_ring_ref;

	uint16_t		xnf_evtchn;	/* channel to back end ctlr */
	grant_ref_t		xnf_gref_tx_head;	/* tx grant free list */
	grant_ref_t		xnf_gref_rx_head;	/* rx grant free list */
	kcondvar_t		xnf_cv;

	boolean_t		xnf_rx_hvcopy;	/* do we do HV copy? */
} xnf_t;

#ifdef __cplusplus
}
#endif

#endif	/* _SYS_XNF_H */