xref: /freebsd/sys/dev/vnic/nicvf_queues.h (revision 95ee2897)
13c0086b8SZbigniew Bodek /*
23c0086b8SZbigniew Bodek  * Copyright (C) 2015 Cavium Inc.
33c0086b8SZbigniew Bodek  * All rights reserved.
43c0086b8SZbigniew Bodek  *
53c0086b8SZbigniew Bodek  * Redistribution and use in source and binary forms, with or without
63c0086b8SZbigniew Bodek  * modification, are permitted provided that the following conditions
73c0086b8SZbigniew Bodek  * are met:
83c0086b8SZbigniew Bodek  * 1. Redistributions of source code must retain the above copyright
93c0086b8SZbigniew Bodek  *    notice, this list of conditions and the following disclaimer.
103c0086b8SZbigniew Bodek  * 2. Redistributions in binary form must reproduce the above copyright
113c0086b8SZbigniew Bodek  *    notice, this list of conditions and the following disclaimer in the
123c0086b8SZbigniew Bodek  *    documentation and/or other materials provided with the distribution.
133c0086b8SZbigniew Bodek  *
143c0086b8SZbigniew Bodek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
153c0086b8SZbigniew Bodek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
163c0086b8SZbigniew Bodek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
173c0086b8SZbigniew Bodek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
183c0086b8SZbigniew Bodek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
193c0086b8SZbigniew Bodek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
203c0086b8SZbigniew Bodek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
213c0086b8SZbigniew Bodek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
223c0086b8SZbigniew Bodek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
233c0086b8SZbigniew Bodek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
243c0086b8SZbigniew Bodek  * SUCH DAMAGE.
253c0086b8SZbigniew Bodek  *
263c0086b8SZbigniew Bodek  */
273c0086b8SZbigniew Bodek 
283c0086b8SZbigniew Bodek #ifndef NICVF_QUEUES_H
293c0086b8SZbigniew Bodek #define	NICVF_QUEUES_H
303c0086b8SZbigniew Bodek 
313c0086b8SZbigniew Bodek #include "q_struct.h"
323c0086b8SZbigniew Bodek 
333c0086b8SZbigniew Bodek #define	MAX_QUEUE_SET			128
343c0086b8SZbigniew Bodek #define	MAX_RCV_QUEUES_PER_QS		8
353c0086b8SZbigniew Bodek #define	MAX_RCV_BUF_DESC_RINGS_PER_QS	2
363c0086b8SZbigniew Bodek #define	MAX_SND_QUEUES_PER_QS		8
373c0086b8SZbigniew Bodek #define	MAX_CMP_QUEUES_PER_QS		8
383c0086b8SZbigniew Bodek 
393c0086b8SZbigniew Bodek /* VF's queue interrupt ranges */
403c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_CQ		0
413c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_SQ		8
423c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_RBDR		16
433c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_MISC		18
443c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_QS_ERR		19
453c0086b8SZbigniew Bodek 
463c0086b8SZbigniew Bodek #define	for_each_cq_irq(irq)	\
472306b72aSZbigniew Bodek 	for ((irq) = NICVF_INTR_ID_CQ; (irq) < NICVF_INTR_ID_SQ; (irq)++)
483c0086b8SZbigniew Bodek #define	for_each_sq_irq(irq)	\
492306b72aSZbigniew Bodek 	for ((irq) = NICVF_INTR_ID_SQ; (irq) < NICVF_INTR_ID_RBDR; (irq)++)
503c0086b8SZbigniew Bodek #define	for_each_rbdr_irq(irq)	\
512306b72aSZbigniew Bodek 	for ((irq) = NICVF_INTR_ID_RBDR; (irq) < NICVF_INTR_ID_MISC; (irq)++)
523c0086b8SZbigniew Bodek 
532306b72aSZbigniew Bodek #define	RBDR_SIZE0		0UL /* 8K entries */
542306b72aSZbigniew Bodek #define	RBDR_SIZE1		1UL /* 16K entries */
552306b72aSZbigniew Bodek #define	RBDR_SIZE2		2UL /* 32K entries */
562306b72aSZbigniew Bodek #define	RBDR_SIZE3		3UL /* 64K entries */
572306b72aSZbigniew Bodek #define	RBDR_SIZE4		4UL /* 126K entries */
582306b72aSZbigniew Bodek #define	RBDR_SIZE5		5UL /* 256K entries */
592306b72aSZbigniew Bodek #define	RBDR_SIZE6		6UL /* 512K entries */
603c0086b8SZbigniew Bodek 
612306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE0		0UL /* 1K entries */
622306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE1		1UL /* 2K entries */
632306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE2		2UL /* 4K entries */
642306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE3		3UL /* 8K entries */
652306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE4		4UL /* 16K entries */
662306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE5		5UL /* 32K entries */
672306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE6		6UL /* 64K entries */
683c0086b8SZbigniew Bodek 
692306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE0		0UL /* 1K entries */
702306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE1		1UL /* 2K entries */
712306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE2		2UL /* 4K entries */
722306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE3		3UL /* 8K entries */
732306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE4		4UL /* 16K entries */
742306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE5		5UL /* 32K entries */
752306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE6		6UL /* 64K entries */
763c0086b8SZbigniew Bodek 
773c0086b8SZbigniew Bodek /* Default queue count per QS, its lengths and threshold values */
783c0086b8SZbigniew Bodek #define	RBDR_CNT		1
793c0086b8SZbigniew Bodek #define	RCV_QUEUE_CNT		8
803c0086b8SZbigniew Bodek #define	SND_QUEUE_CNT		8
813c0086b8SZbigniew Bodek #define	CMP_QUEUE_CNT		8 /* Max of RCV and SND qcount */
823c0086b8SZbigniew Bodek 
833c0086b8SZbigniew Bodek #define	SND_QSIZE		SND_QUEUE_SIZE2
842306b72aSZbigniew Bodek #define	SND_QUEUE_LEN		(1UL << (SND_QSIZE + 10))
852306b72aSZbigniew Bodek #define	MAX_SND_QUEUE_LEN	(1UL << (SND_QUEUE_SIZE6 + 10))
862306b72aSZbigniew Bodek #define	SND_QUEUE_THRESH	2UL
873c0086b8SZbigniew Bodek #define	MIN_SQ_DESC_PER_PKT_XMIT	2
883c0086b8SZbigniew Bodek /* Since timestamp not enabled, otherwise 2 */
893c0086b8SZbigniew Bodek #define	MAX_CQE_PER_PKT_XMIT		1
903c0086b8SZbigniew Bodek 
912306b72aSZbigniew Bodek /*
922306b72aSZbigniew Bodek  * Keep CQ and SQ sizes same, if timestamping
933c0086b8SZbigniew Bodek  * is enabled this equation will change.
943c0086b8SZbigniew Bodek  */
953c0086b8SZbigniew Bodek #define	CMP_QSIZE		CMP_QUEUE_SIZE2
962306b72aSZbigniew Bodek #define	CMP_QUEUE_LEN		(1UL << (CMP_QSIZE + 10))
973bdcfeadSZbigniew Bodek #define	CMP_QUEUE_CQE_THRESH	32
983c0086b8SZbigniew Bodek #define	CMP_QUEUE_TIMER_THRESH	220 /* 10usec */
993c0086b8SZbigniew Bodek 
1003c0086b8SZbigniew Bodek #define	RBDR_SIZE		RBDR_SIZE0
1012306b72aSZbigniew Bodek #define	RCV_BUF_COUNT		(1UL << (RBDR_SIZE + 13))
1022306b72aSZbigniew Bodek #define	MAX_RCV_BUF_COUNT	(1UL << (RBDR_SIZE6 + 13))
1033c0086b8SZbigniew Bodek #define	RBDR_THRESH		(RCV_BUF_COUNT / 2)
1043c0086b8SZbigniew Bodek #define	DMA_BUFFER_LEN		2048 /* In multiples of 128bytes */
1053c0086b8SZbigniew Bodek 
1062306b72aSZbigniew Bodek #define	MAX_CQES_FOR_TX		\
1072306b72aSZbigniew Bodek     ((SND_QUEUE_LEN / MIN_SQ_DESC_PER_PKT_XMIT) * MAX_CQE_PER_PKT_XMIT)
1083c0086b8SZbigniew Bodek /* Calculate number of CQEs to reserve for all SQEs.
1093c0086b8SZbigniew Bodek  * Its 1/256th level of CQ size.
1103c0086b8SZbigniew Bodek  * '+ 1' to account for pipelining
1113c0086b8SZbigniew Bodek  */
1122306b72aSZbigniew Bodek #define	RQ_CQ_DROP		\
1132306b72aSZbigniew Bodek     ((256 / (CMP_QUEUE_LEN / (CMP_QUEUE_LEN - MAX_CQES_FOR_TX))) + 1)
1143c0086b8SZbigniew Bodek 
1153c0086b8SZbigniew Bodek /* Descriptor size in bytes */
1163c0086b8SZbigniew Bodek #define	SND_QUEUE_DESC_SIZE	16
1173c0086b8SZbigniew Bodek #define	CMP_QUEUE_DESC_SIZE	512
1183c0086b8SZbigniew Bodek 
1193c0086b8SZbigniew Bodek /* Buffer / descriptor alignments */
1203c0086b8SZbigniew Bodek #define	NICVF_RCV_BUF_ALIGN		7
1212306b72aSZbigniew Bodek #define	NICVF_RCV_BUF_ALIGN_BYTES	(1UL << NICVF_RCV_BUF_ALIGN)
1223c0086b8SZbigniew Bodek #define	NICVF_CQ_BASE_ALIGN_BYTES	512  /* 9 bits */
1233c0086b8SZbigniew Bodek #define	NICVF_SQ_BASE_ALIGN_BYTES	128  /* 7 bits */
1243c0086b8SZbigniew Bodek 
1252306b72aSZbigniew Bodek #define	NICVF_ALIGNED_ADDR(addr, align_bytes)	\
1262306b72aSZbigniew Bodek     roundup2((addr), (align_bytes))
1272306b72aSZbigniew Bodek #define	NICVF_ADDR_ALIGN_LEN(addr, bytes)	\
1282306b72aSZbigniew Bodek     (NICVF_ALIGNED_ADDR((addr), (bytes)) - (bytes))
1292306b72aSZbigniew Bodek #define	NICVF_RCV_BUF_ALIGN_LEN(addr)		\
1302306b72aSZbigniew Bodek     (NICVF_ALIGNED_ADDR((addr), NICVF_RCV_BUF_ALIGN_BYTES) - (addr))
1312306b72aSZbigniew Bodek 
132af8fe8f1SZbigniew Bodek #define	NICVF_TXBUF_MAXSIZE	NIC_HW_MAX_FRS	/* Total max payload without TSO */
1332306b72aSZbigniew Bodek #define	NICVF_TXBUF_NSEGS	256	/* Single command is at most 256 buffers
1342306b72aSZbigniew Bodek 					   (hdr + 255 subcmds) */
135af8fe8f1SZbigniew Bodek /* TSO-related definitions */
136af8fe8f1SZbigniew Bodek #define	NICVF_TSO_MAXSIZE	IP_MAXPACKET
137af8fe8f1SZbigniew Bodek #define	NICVF_TSO_NSEGS		NICVF_TXBUF_NSEGS
138af8fe8f1SZbigniew Bodek #define	NICVF_TSO_HEADER_SIZE	128
1393c0086b8SZbigniew Bodek 
1403c0086b8SZbigniew Bodek /* Queue enable/disable */
1412306b72aSZbigniew Bodek #define	NICVF_SQ_EN		(1UL << 19)
1423c0086b8SZbigniew Bodek 
1433c0086b8SZbigniew Bodek /* Queue reset */
1442306b72aSZbigniew Bodek #define	NICVF_CQ_RESET		(1UL << 41)
1452306b72aSZbigniew Bodek #define	NICVF_SQ_RESET		(1UL << 17)
1462306b72aSZbigniew Bodek #define	NICVF_RBDR_RESET	(1UL << 43)
1473c0086b8SZbigniew Bodek 
1483c0086b8SZbigniew Bodek enum CQ_RX_ERRLVL_E {
1493c0086b8SZbigniew Bodek 	CQ_ERRLVL_MAC,
1503c0086b8SZbigniew Bodek 	CQ_ERRLVL_L2,
1513c0086b8SZbigniew Bodek 	CQ_ERRLVL_L3,
1523c0086b8SZbigniew Bodek 	CQ_ERRLVL_L4,
1533c0086b8SZbigniew Bodek };
1543c0086b8SZbigniew Bodek 
1553c0086b8SZbigniew Bodek enum CQ_RX_ERROP_E {
1563c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_NONE = 0x0,
1573c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_PARTIAL = 0x1,
1583c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_JABBER = 0x2,
1593c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_FCS = 0x7,
1603c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_TERMINATE = 0x9,
1613c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_RX_CTL = 0xb,
1623c0086b8SZbigniew Bodek 	CQ_RX_ERROP_PREL2_ERR = 0x1f,
1633c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_FRAGMENT = 0x20,
1643c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_OVERRUN = 0x21,
1653c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_PFCS = 0x22,
1663c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_PUNY = 0x23,
1673c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_MAL = 0x24,
1683c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_OVERSIZE = 0x25,
1693c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_UNDERSIZE = 0x26,
1703c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_LENMISM = 0x27,
1713c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_PCLP = 0x28,
1723c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_NOT = 0x41,
1733c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_CSUM_ERR = 0x42,
1743c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_MAL = 0x43,
1753c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_MALD = 0x44,
1763c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_HOP = 0x45,
1773c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L3_ICRC = 0x46,
1783c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L3_PCLP = 0x47,
1793c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_MAL = 0x61,
1803c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_CHK = 0x62,
1813c0086b8SZbigniew Bodek 	CQ_RX_ERROP_UDP_LEN = 0x63,
1823c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_PORT = 0x64,
1833c0086b8SZbigniew Bodek 	CQ_RX_ERROP_TCP_FLAG = 0x65,
1843c0086b8SZbigniew Bodek 	CQ_RX_ERROP_TCP_OFFSET = 0x66,
1853c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_PCLP = 0x67,
1863c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RBDR_TRUNC = 0x70,
1873c0086b8SZbigniew Bodek };
1883c0086b8SZbigniew Bodek 
1893c0086b8SZbigniew Bodek enum CQ_TX_ERROP_E {
1903c0086b8SZbigniew Bodek 	CQ_TX_ERROP_GOOD = 0x0,
1913c0086b8SZbigniew Bodek 	CQ_TX_ERROP_DESC_FAULT = 0x10,
1923c0086b8SZbigniew Bodek 	CQ_TX_ERROP_HDR_CONS_ERR = 0x11,
1933c0086b8SZbigniew Bodek 	CQ_TX_ERROP_SUBDC_ERR = 0x12,
1943c0086b8SZbigniew Bodek 	CQ_TX_ERROP_IMM_SIZE_OFLOW = 0x80,
1953c0086b8SZbigniew Bodek 	CQ_TX_ERROP_DATA_SEQUENCE_ERR = 0x81,
1963c0086b8SZbigniew Bodek 	CQ_TX_ERROP_MEM_SEQUENCE_ERR = 0x82,
1973c0086b8SZbigniew Bodek 	CQ_TX_ERROP_LOCK_VIOL = 0x83,
1983c0086b8SZbigniew Bodek 	CQ_TX_ERROP_DATA_FAULT = 0x84,
1993c0086b8SZbigniew Bodek 	CQ_TX_ERROP_TSTMP_CONFLICT = 0x85,
2003c0086b8SZbigniew Bodek 	CQ_TX_ERROP_TSTMP_TIMEOUT = 0x86,
2013c0086b8SZbigniew Bodek 	CQ_TX_ERROP_MEM_FAULT = 0x87,
2023c0086b8SZbigniew Bodek 	CQ_TX_ERROP_CK_OVERLAP = 0x88,
2033c0086b8SZbigniew Bodek 	CQ_TX_ERROP_CK_OFLOW = 0x89,
2043c0086b8SZbigniew Bodek 	CQ_TX_ERROP_ENUM_LAST = 0x8a,
2053c0086b8SZbigniew Bodek };
2063c0086b8SZbigniew Bodek 
2073c0086b8SZbigniew Bodek struct cmp_queue_stats {
2083c0086b8SZbigniew Bodek 	struct tx_stats {
2092306b72aSZbigniew Bodek 		uint64_t good;
2102306b72aSZbigniew Bodek 		uint64_t desc_fault;
2112306b72aSZbigniew Bodek 		uint64_t hdr_cons_err;
2122306b72aSZbigniew Bodek 		uint64_t subdesc_err;
2132306b72aSZbigniew Bodek 		uint64_t imm_size_oflow;
2142306b72aSZbigniew Bodek 		uint64_t data_seq_err;
2152306b72aSZbigniew Bodek 		uint64_t mem_seq_err;
2162306b72aSZbigniew Bodek 		uint64_t lock_viol;
2172306b72aSZbigniew Bodek 		uint64_t data_fault;
2182306b72aSZbigniew Bodek 		uint64_t tstmp_conflict;
2192306b72aSZbigniew Bodek 		uint64_t tstmp_timeout;
2202306b72aSZbigniew Bodek 		uint64_t mem_fault;
2212306b72aSZbigniew Bodek 		uint64_t csum_overlap;
2222306b72aSZbigniew Bodek 		uint64_t csum_overflow;
2233c0086b8SZbigniew Bodek 	} tx;
2242306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2253c0086b8SZbigniew Bodek 
2263c0086b8SZbigniew Bodek enum RQ_SQ_STATS {
2273c0086b8SZbigniew Bodek 	RQ_SQ_STATS_OCTS,
2283c0086b8SZbigniew Bodek 	RQ_SQ_STATS_PKTS,
2293c0086b8SZbigniew Bodek };
2303c0086b8SZbigniew Bodek 
2313c0086b8SZbigniew Bodek struct rx_tx_queue_stats {
2322306b72aSZbigniew Bodek 	uint64_t	bytes;
2332306b72aSZbigniew Bodek 	uint64_t	pkts;
2342306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2353c0086b8SZbigniew Bodek 
2363c0086b8SZbigniew Bodek struct q_desc_mem {
2372306b72aSZbigniew Bodek 	bus_dma_tag_t	dmat;
2382306b72aSZbigniew Bodek 	bus_dmamap_t	dmap;
2393c0086b8SZbigniew Bodek 	void		*base;
2402306b72aSZbigniew Bodek 	bus_addr_t	phys_base;
2412306b72aSZbigniew Bodek 	uint64_t	size;
2422306b72aSZbigniew Bodek 	uint16_t	q_len;
2433c0086b8SZbigniew Bodek };
2443c0086b8SZbigniew Bodek 
2453c0086b8SZbigniew Bodek struct rbdr {
2462306b72aSZbigniew Bodek 	boolean_t		enable;
2472306b72aSZbigniew Bodek 	uint32_t		dma_size;
2482306b72aSZbigniew Bodek 	uint32_t		frag_len;
2492306b72aSZbigniew Bodek 	uint32_t		thresh;		/* Threshold level for interrupt */
2503c0086b8SZbigniew Bodek 	void			*desc;
2512306b72aSZbigniew Bodek 	uint32_t		head;
2522306b72aSZbigniew Bodek 	uint32_t		tail;
2533c0086b8SZbigniew Bodek 	struct q_desc_mem	dmem;
2542306b72aSZbigniew Bodek 
2552306b72aSZbigniew Bodek 	struct nicvf		*nic;
2562306b72aSZbigniew Bodek 	int			idx;
2572306b72aSZbigniew Bodek 
2582306b72aSZbigniew Bodek 	struct task		rbdr_task;
2592306b72aSZbigniew Bodek 	struct task		rbdr_task_nowait;
2602306b72aSZbigniew Bodek 	struct taskqueue	*rbdr_taskq;
2612306b72aSZbigniew Bodek 
2622306b72aSZbigniew Bodek 	bus_dma_tag_t		rbdr_buff_dmat;
2632306b72aSZbigniew Bodek 	bus_dmamap_t		*rbdr_buff_dmaps;
2642306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2653c0086b8SZbigniew Bodek 
2663c0086b8SZbigniew Bodek struct rcv_queue {
2672306b72aSZbigniew Bodek 	boolean_t	enable;
2683c0086b8SZbigniew Bodek 	struct	rbdr	*rbdr_start;
2693c0086b8SZbigniew Bodek 	struct	rbdr	*rbdr_cont;
2702306b72aSZbigniew Bodek 	boolean_t	en_tcp_reassembly;
2712306b72aSZbigniew Bodek 	uint8_t		cq_qs;  /* CQ's QS to which this RQ is assigned */
2722306b72aSZbigniew Bodek 	uint8_t		cq_idx; /* CQ index (0 to 7) in the QS */
2732306b72aSZbigniew Bodek 	uint8_t		cont_rbdr_qs;      /* Continue buffer ptrs - QS num */
2742306b72aSZbigniew Bodek 	uint8_t		cont_qs_rbdr_idx;  /* RBDR idx in the cont QS */
2752306b72aSZbigniew Bodek 	uint8_t		start_rbdr_qs;     /* First buffer ptrs - QS num */
2762306b72aSZbigniew Bodek 	uint8_t		start_qs_rbdr_idx; /* RBDR idx in the above QS */
2772306b72aSZbigniew Bodek 	uint8_t		caching;
2783c0086b8SZbigniew Bodek 	struct		rx_tx_queue_stats stats;
279053f3d0eSZbigniew Bodek 
280053f3d0eSZbigniew Bodek 	boolean_t	lro_enabled;
281053f3d0eSZbigniew Bodek 	struct lro_ctrl	lro;
2822306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2833c0086b8SZbigniew Bodek 
2843c0086b8SZbigniew Bodek struct cmp_queue {
2852306b72aSZbigniew Bodek 	boolean_t		enable;
2862306b72aSZbigniew Bodek 	uint16_t		thresh;
2872306b72aSZbigniew Bodek 
2882306b72aSZbigniew Bodek 	struct nicvf		*nic;
2892306b72aSZbigniew Bodek 	int			idx;	/* This queue index */
2902306b72aSZbigniew Bodek 
2912306b72aSZbigniew Bodek 	struct buf_ring		*rx_br;	/* Reception buf ring */
2922306b72aSZbigniew Bodek 	struct mtx		mtx;	/* lock to serialize processing CQEs */
2932306b72aSZbigniew Bodek 	char			mtx_name[32];
2942306b72aSZbigniew Bodek 
2952306b72aSZbigniew Bodek 	struct task		cmp_task;
2962306b72aSZbigniew Bodek 	struct taskqueue	*cmp_taskq;
297ec6f8f42SZbigniew Bodek 	u_int			cmp_cpuid; /* CPU to which bind the CQ task */
2982306b72aSZbigniew Bodek 
2993c0086b8SZbigniew Bodek 	void			*desc;
3003c0086b8SZbigniew Bodek 	struct q_desc_mem	dmem;
3013c0086b8SZbigniew Bodek 	struct cmp_queue_stats	stats;
3023c0086b8SZbigniew Bodek 	int			irq;
3032306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
3042306b72aSZbigniew Bodek 
3052306b72aSZbigniew Bodek struct snd_buff {
3062306b72aSZbigniew Bodek 	bus_dmamap_t	dmap;
3072306b72aSZbigniew Bodek 	struct mbuf	*mbuf;
3082306b72aSZbigniew Bodek };
3093c0086b8SZbigniew Bodek 
3103c0086b8SZbigniew Bodek struct snd_queue {
3112306b72aSZbigniew Bodek 	boolean_t		enable;
3122306b72aSZbigniew Bodek 	uint8_t			cq_qs;  /* CQ's QS to which this SQ is pointing */
3132306b72aSZbigniew Bodek 	uint8_t			cq_idx; /* CQ index (0 to 7) in the above QS */
3142306b72aSZbigniew Bodek 	uint16_t		thresh;
3152306b72aSZbigniew Bodek 	volatile int		free_cnt;
3162306b72aSZbigniew Bodek 	uint32_t		head;
3172306b72aSZbigniew Bodek 	uint32_t		tail;
3182306b72aSZbigniew Bodek 	uint64_t		*skbuff;
3193c0086b8SZbigniew Bodek 	void			*desc;
3203c0086b8SZbigniew Bodek 
3212306b72aSZbigniew Bodek 	struct nicvf		*nic;
3222306b72aSZbigniew Bodek 	int			idx;	/* This queue index */
3232306b72aSZbigniew Bodek 
3242306b72aSZbigniew Bodek 	bus_dma_tag_t		snd_buff_dmat;
3252306b72aSZbigniew Bodek 	struct snd_buff		*snd_buff;
3262306b72aSZbigniew Bodek 
3272306b72aSZbigniew Bodek 	struct buf_ring		*br;	/* Transmission buf ring */
3282306b72aSZbigniew Bodek 	struct mtx		mtx;
3292306b72aSZbigniew Bodek 	char			mtx_name[32];
3302306b72aSZbigniew Bodek 
3312306b72aSZbigniew Bodek 	struct task		snd_task;
3322306b72aSZbigniew Bodek 	struct taskqueue	*snd_taskq;
3332306b72aSZbigniew Bodek 
3343c0086b8SZbigniew Bodek 	struct q_desc_mem	dmem;
3353c0086b8SZbigniew Bodek 	struct rx_tx_queue_stats stats;
3362306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
3373c0086b8SZbigniew Bodek 
3383c0086b8SZbigniew Bodek struct queue_set {
3392306b72aSZbigniew Bodek 	boolean_t	enable;
3402306b72aSZbigniew Bodek 	boolean_t	be_en;
3412306b72aSZbigniew Bodek 	uint8_t		vnic_id;
3422306b72aSZbigniew Bodek 	uint8_t		rq_cnt;
3432306b72aSZbigniew Bodek 	uint8_t		cq_cnt;
3442306b72aSZbigniew Bodek 	uint64_t	cq_len;
3452306b72aSZbigniew Bodek 	uint8_t		sq_cnt;
3462306b72aSZbigniew Bodek 	uint64_t	sq_len;
3472306b72aSZbigniew Bodek 	uint8_t		rbdr_cnt;
3482306b72aSZbigniew Bodek 	uint64_t	rbdr_len;
3493c0086b8SZbigniew Bodek 	struct	rcv_queue	rq[MAX_RCV_QUEUES_PER_QS];
3503c0086b8SZbigniew Bodek 	struct	cmp_queue	cq[MAX_CMP_QUEUES_PER_QS];
3513c0086b8SZbigniew Bodek 	struct	snd_queue	sq[MAX_SND_QUEUES_PER_QS];
3523c0086b8SZbigniew Bodek 	struct	rbdr		rbdr[MAX_RCV_BUF_DESC_RINGS_PER_QS];
3532306b72aSZbigniew Bodek 
3542306b72aSZbigniew Bodek 	struct task		qs_err_task;
3552306b72aSZbigniew Bodek 	struct taskqueue	*qs_err_taskq;
3562306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
3573c0086b8SZbigniew Bodek 
3583c0086b8SZbigniew Bodek #define	GET_RBDR_DESC(RING, idx)				\
3592306b72aSZbigniew Bodek     (&(((struct rbdr_entry_t *)((RING)->desc))[(idx)]))
3603c0086b8SZbigniew Bodek #define	GET_SQ_DESC(RING, idx)					\
3612306b72aSZbigniew Bodek     (&(((struct sq_hdr_subdesc *)((RING)->desc))[(idx)]))
3623c0086b8SZbigniew Bodek #define	GET_CQ_DESC(RING, idx)					\
3632306b72aSZbigniew Bodek     (&(((union cq_desc_t *)((RING)->desc))[(idx)]))
3643c0086b8SZbigniew Bodek 
3653c0086b8SZbigniew Bodek /* CQ status bits */
3662306b72aSZbigniew Bodek #define	CQ_WR_FUL	(1UL << 26)
3672306b72aSZbigniew Bodek #define	CQ_WR_DISABLE	(1UL << 25)
3682306b72aSZbigniew Bodek #define	CQ_WR_FAULT	(1UL << 24)
3693c0086b8SZbigniew Bodek #define	CQ_CQE_COUNT	(0xFFFF << 0)
3703c0086b8SZbigniew Bodek 
3712306b72aSZbigniew Bodek #define	CQ_ERR_MASK	(CQ_WR_FUL | CQ_WR_DISABLE | CQ_WR_FAULT)
3723c0086b8SZbigniew Bodek 
3732306b72aSZbigniew Bodek #define	NICVF_TX_LOCK(sq)		mtx_lock(&(sq)->mtx)
3742306b72aSZbigniew Bodek #define	NICVF_TX_TRYLOCK(sq)		mtx_trylock(&(sq)->mtx)
3752306b72aSZbigniew Bodek #define	NICVF_TX_UNLOCK(sq)		mtx_unlock(&(sq)->mtx)
3762306b72aSZbigniew Bodek #define	NICVF_TX_LOCK_ASSERT(sq)	mtx_assert(&(sq)->mtx, MA_OWNED)
3773c0086b8SZbigniew Bodek 
3782306b72aSZbigniew Bodek #define	NICVF_CMP_LOCK(cq)		mtx_lock(&(cq)->mtx)
3792306b72aSZbigniew Bodek #define	NICVF_CMP_UNLOCK(cq)		mtx_unlock(&(cq)->mtx)
3803c0086b8SZbigniew Bodek 
3812306b72aSZbigniew Bodek int nicvf_set_qset_resources(struct nicvf *);
3822306b72aSZbigniew Bodek int nicvf_config_data_transfer(struct nicvf *, boolean_t);
3832306b72aSZbigniew Bodek void nicvf_qset_config(struct nicvf *, boolean_t);
3843c0086b8SZbigniew Bodek 
3852306b72aSZbigniew Bodek void nicvf_enable_intr(struct nicvf *, int, int);
3862306b72aSZbigniew Bodek void nicvf_disable_intr(struct nicvf *, int, int);
3872306b72aSZbigniew Bodek void nicvf_clear_intr(struct nicvf *, int, int);
3882306b72aSZbigniew Bodek int nicvf_is_intr_enabled(struct nicvf *, int, int);
3893c0086b8SZbigniew Bodek 
3907c617aceSZbigniew Bodek int nicvf_xmit_locked(struct snd_queue *sq);
391332c8697SZbigniew Bodek 
3923c0086b8SZbigniew Bodek /* Register access APIs */
3932306b72aSZbigniew Bodek void nicvf_reg_write(struct nicvf *, uint64_t, uint64_t);
3942306b72aSZbigniew Bodek uint64_t nicvf_reg_read(struct nicvf *, uint64_t);
3952306b72aSZbigniew Bodek void nicvf_qset_reg_write(struct nicvf *, uint64_t, uint64_t);
3962306b72aSZbigniew Bodek uint64_t nicvf_qset_reg_read(struct nicvf *, uint64_t);
3972306b72aSZbigniew Bodek void nicvf_queue_reg_write(struct nicvf *, uint64_t, uint64_t, uint64_t);
3982306b72aSZbigniew Bodek uint64_t nicvf_queue_reg_read(struct nicvf *, uint64_t, uint64_t);
3993c0086b8SZbigniew Bodek 
4003c0086b8SZbigniew Bodek /* Stats */
4012306b72aSZbigniew Bodek void nicvf_update_rq_stats(struct nicvf *, int);
4022306b72aSZbigniew Bodek void nicvf_update_sq_stats(struct nicvf *, int);
4032306b72aSZbigniew Bodek int nicvf_check_cqe_rx_errs(struct nicvf *, struct cmp_queue *,
4042306b72aSZbigniew Bodek     struct cqe_rx_t *);
4052306b72aSZbigniew Bodek int nicvf_check_cqe_tx_errs(struct nicvf *,struct cmp_queue *,
4062306b72aSZbigniew Bodek     struct cqe_send_t *);
4073c0086b8SZbigniew Bodek #endif /* NICVF_QUEUES_H */
408