xref: /onnv-gate/usr/src/uts/common/io/hxge/hxge_rxdma.h (revision 11257:9e958eb3e4e3)
16349Sqs148142 /*
26349Sqs148142  * CDDL HEADER START
36349Sqs148142  *
46349Sqs148142  * The contents of this file are subject to the terms of the
56349Sqs148142  * Common Development and Distribution License (the "License").
66349Sqs148142  * You may not use this file except in compliance with the License.
76349Sqs148142  *
86349Sqs148142  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96349Sqs148142  * or http://www.opensolaris.org/os/licensing.
106349Sqs148142  * See the License for the specific language governing permissions
116349Sqs148142  * and limitations under the License.
126349Sqs148142  *
136349Sqs148142  * When distributing Covered Code, include this CDDL HEADER in each
146349Sqs148142  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156349Sqs148142  * If applicable, add the following below this CDDL HEADER, with the
166349Sqs148142  * fields enclosed by brackets "[]" replaced with your own identifying
176349Sqs148142  * information: Portions Copyright [yyyy] [name of copyright owner]
186349Sqs148142  *
196349Sqs148142  * CDDL HEADER END
206349Sqs148142  */
216349Sqs148142 /*
228544SQiyan.Sun@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
236349Sqs148142  * Use is subject to license terms.
246349Sqs148142  */
256349Sqs148142 
266349Sqs148142 #ifndef	_SYS_HXGE_HXGE_RXDMA_H
276349Sqs148142 #define	_SYS_HXGE_HXGE_RXDMA_H
286349Sqs148142 
296349Sqs148142 #ifdef	__cplusplus
306349Sqs148142 extern "C" {
316349Sqs148142 #endif
326349Sqs148142 
336349Sqs148142 #include <hxge_rdc_hw.h>
346349Sqs148142 #include <hpi_rxdma.h>
356349Sqs148142 
368544SQiyan.Sun@Sun.COM #define	RXDMA_CK_DIV_DEFAULT		25000	/* 84 usec */
378422SMichael.Speer@Sun.COM #define	RXDMA_RCR_PTHRES_DEFAULT	0x1
387949SQiyan.Sun@Sun.COM #define	RXDMA_RCR_TO_DEFAULT		0x1
396349Sqs148142 #define	RXDMA_HDR_SIZE_DEFAULT		2
406349Sqs148142 #define	RXDMA_HDR_SIZE_FULL		6	/* entire header of 6B */
416349Sqs148142 
426349Sqs148142 /*
436349Sqs148142  * Receive Completion Ring (RCR)
446349Sqs148142  */
456349Sqs148142 #define	RCR_PKT_BUF_ADDR_SHIFT		0			/* bit 37:0 */
466349Sqs148142 #define	RCR_PKT_BUF_ADDR_SHIFT_FULL	6	/* fulll buffer address */
476349Sqs148142 #define	RCR_PKT_BUF_ADDR_MASK		0x0000003FFFFFFFFFULL
486349Sqs148142 #define	RCR_PKTBUFSZ_SHIFT		38			/* bit 39:38 */
496349Sqs148142 #define	RCR_PKTBUFSZ_MASK		0x000000C000000000ULL
506349Sqs148142 #define	RCR_L2_LEN_SHIFT		40			/* bit 53:40 */
516349Sqs148142 #define	RCR_L2_LEN_MASK			0x003fff0000000000ULL
526349Sqs148142 #define	RCR_ERROR_SHIFT			54			/* bit 57:54 */
536349Sqs148142 #define	RCR_ERROR_MASK			0x03C0000000000000ULL
546349Sqs148142 #define	RCR_PKT_TYPE_SHIFT		61			/* bit 62:61 */
556349Sqs148142 #define	RCR_PKT_TYPE_MASK		0x6000000000000000ULL
566349Sqs148142 #define	RCR_MULTI_SHIFT			63			/* bit 63 */
576349Sqs148142 #define	RCR_MULTI_MASK			0x8000000000000000ULL
586349Sqs148142 
596349Sqs148142 #define	RCR_PKTBUFSZ_0			0x00
606349Sqs148142 #define	RCR_PKTBUFSZ_1			0x01
616349Sqs148142 #define	RCR_PKTBUFSZ_2			0x02
626349Sqs148142 #define	RCR_SINGLE_BLOCK		0x03
63*11257SMichael.Speer@Sun.COM #define	N_PKTSIZE_TYPES			0x04
646349Sqs148142 
656349Sqs148142 #define	RCR_NO_ERROR			0x0
666349Sqs148142 #define	RCR_CTRL_FIFO_DED		0x1
676349Sqs148142 #define	RCR_DATA_FIFO_DED		0x2
686349Sqs148142 #define	RCR_ERROR_RESERVE		0x4
696349Sqs148142 
706349Sqs148142 #define	RCR_PKT_IS_TCP			0x2000000000000000ULL
716349Sqs148142 #define	RCR_PKT_IS_UDP			0x4000000000000000ULL
726349Sqs148142 #define	RCR_PKT_IS_SCTP			0x6000000000000000ULL
736349Sqs148142 
746349Sqs148142 #define	RDC_INT_MASK_RBRFULL_SHIFT	34
756349Sqs148142 #define	RDC_INT_MASK_RBRFULL_MASK	0x0000000400000000ULL
766349Sqs148142 #define	RDC_INT_MASK_RBREMPTY_SHIFT	35
776349Sqs148142 #define	RDC_INT_MASK_RBREMPTY_MASK	0x0000000800000000ULL
786349Sqs148142 #define	RDC_INT_MASK_RCRFULL_SHIFT	36
796349Sqs148142 #define	RDC_INT_MASK_RCRFULL_MASK	0x0000001000000000ULL
806349Sqs148142 #define	RDC_INT_MASK_RCRSH_FULL_SHIFT	39
816349Sqs148142 #define	RDC_INT_MASK_RCRSH_FULL_MASK	0x0000008000000000ULL
826349Sqs148142 #define	RDC_INT_MASK_RBR_PRE_EMPTY_SHIFT	40
836349Sqs148142 #define	RDC_INT_MASK_RBR_PRE_EMPTY_MASK	0x0000010000000000ULL
846349Sqs148142 #define	RDC_INT_MASK_RBR_PRE_PAR_SHIFT	43
856349Sqs148142 #define	RDC_INT_MASK_RBR_PRE_PAR_MASK	0x0000080000000000ULL
866349Sqs148142 #define	RDC_INT_MASK_RCR_SHA_PAR_SHIFT	44
876349Sqs148142 #define	RDC_INT_MASK_RCR_SHA_PAR_MASK	0x0000100000000000ULL
886349Sqs148142 #define	RDC_INT_MASK_RCRTO_SHIFT	45
896349Sqs148142 #define	RDC_INT_MASK_RCRTO_MASK		0x0000200000000000ULL
906349Sqs148142 #define	RDC_INT_MASK_THRES_SHIFT	46
916349Sqs148142 #define	RDC_INT_MASK_THRES_MASK		0x0000400000000000ULL
926349Sqs148142 #define	RDC_INT_MASK_PEU_ERR_SHIFT	52
936349Sqs148142 #define	RDC_INT_MASK_PEU_ERR_MASK	0x0010000000000000ULL
946349Sqs148142 #define	RDC_INT_MASK_RBR_CPL_SHIFT	53
956349Sqs148142 #define	RDC_INT_MASK_RBR_CPL_MASK	0x0020000000000000ULL
966349Sqs148142 #define	RDC_INT_MASK_ALL	(RDC_INT_MASK_RBRFULL_MASK |		\
976349Sqs148142 				RDC_INT_MASK_RBREMPTY_MASK |		\
986349Sqs148142 				RDC_INT_MASK_RCRFULL_MASK |		\
996349Sqs148142 				RDC_INT_MASK_RCRSH_FULL_MASK |		\
1006349Sqs148142 				RDC_INT_MASK_RBR_PRE_EMPTY_MASK |	\
1016349Sqs148142 				RDC_INT_MASK_RBR_PRE_PAR_MASK |		\
1026349Sqs148142 				RDC_INT_MASK_RCR_SHA_PAR_MASK |		\
1036349Sqs148142 				RDC_INT_MASK_RCRTO_MASK |		\
1046349Sqs148142 				RDC_INT_MASK_THRES_MASK |		\
1056349Sqs148142 				RDC_INT_MASK_PEU_ERR_MASK |		\
1066349Sqs148142 				RDC_INT_MASK_RBR_CPL_MASK)
1076349Sqs148142 
1086349Sqs148142 #define	RDC_STAT_PKTREAD_SHIFT			0	/* WO, bit 15:0 */
1096349Sqs148142 #define	RDC_STAT_PKTREAD_MASK			0x000000000000ffffULL
1106349Sqs148142 #define	RDC_STAT_PTRREAD_SHIFT			16	/* WO, bit 31:16 */
1116349Sqs148142 #define	RDC_STAT_PTRREAD_MASK			0x00000000FFFF0000ULL
1126349Sqs148142 
1136349Sqs148142 #define	RDC_STAT_RBRFULL_SHIFT			34	/* RO, bit 34 */
1146349Sqs148142 #define	RDC_STAT_RBRFULL			0x0000000400000000ULL
1156349Sqs148142 #define	RDC_STAT_RBRFULL_MASK			0x0000000400000000ULL
1166349Sqs148142 #define	RDC_STAT_RBREMPTY_SHIFT			35	/* RW1C, bit 35 */
1176349Sqs148142 #define	RDC_STAT_RBREMPTY			0x0000000800000000ULL
1186349Sqs148142 #define	RDC_STAT_RBREMPTY_MASK			0x0000000800000000ULL
1196349Sqs148142 #define	RDC_STAT_RCR_FULL_SHIFT			36	/* RW1C, bit 36 */
1206349Sqs148142 #define	RDC_STAT_RCR_FULL			0x0000001000000000ULL
1216349Sqs148142 #define	RDC_STAT_RCR_FULL_MASK			0x0000001000000000ULL
1226349Sqs148142 
1236349Sqs148142 #define	RDC_STAT_RCR_SHDW_FULL_SHIFT 		39	/* RW1C, bit 39 */
1246349Sqs148142 #define	RDC_STAT_RCR_SHDW_FULL 			0x0000008000000000ULL
1256349Sqs148142 #define	RDC_STAT_RCR_SHDW_FULL_MASK 		0x0000008000000000ULL
1266349Sqs148142 #define	RDC_STAT_RBR_PRE_EMPTY_SHIFT 		40	/* RO, bit 40 */
1276349Sqs148142 #define	RDC_STAT_RBR_PRE_EMPTY 			0x0000010000000000ULL
1286349Sqs148142 #define	RDC_STAT_RBR_PRE_EMPTY_MASK  		0x0000010000000000ULL
1296349Sqs148142 
1306349Sqs148142 #define	RDC_STAT_RBR_PRE_PAR_SHIFT 		43	/* RO, bit 43 */
1316349Sqs148142 #define	RDC_STAT_RBR_PRE_PAR 			0x0000080000000000ULL
1326349Sqs148142 #define	RDC_STAT_RBR_PRE_PAR_MASK  		0x0000080000000000ULL
1336349Sqs148142 #define	RDC_STAT_RCR_SHA_PAR_SHIFT 		44	/* RO, bit 44 */
1346349Sqs148142 #define	RDC_STAT_RCR_SHA_PAR 			0x0000100000000000ULL
1356349Sqs148142 #define	RDC_STAT_RCR_SHA_PAR_MASK  		0x0000100000000000ULL
1366349Sqs148142 
1376349Sqs148142 #define	RDC_STAT_RCR_TO_SHIFT			45	/* RW1C, bit 45 */
1386349Sqs148142 #define	RDC_STAT_RCR_TO				0x0000200000000000ULL
1396349Sqs148142 #define	RDC_STAT_RCR_TO_MASK			0x0000200000000000ULL
1406349Sqs148142 #define	RDC_STAT_RCR_THRES_SHIFT		46	/* RO, bit 46 */
1416349Sqs148142 #define	RDC_STAT_RCR_THRES			0x0000400000000000ULL
1426349Sqs148142 #define	RDC_STAT_RCR_THRES_MASK			0x0000400000000000ULL
1436349Sqs148142 #define	RDC_STAT_RCR_MEX_SHIFT			47	/* RW, bit 47 */
1446349Sqs148142 #define	RDC_STAT_RCR_MEX			0x0000800000000000ULL
1456349Sqs148142 #define	RDC_STAT_RCR_MEX_MASK			0x0000800000000000ULL
1466349Sqs148142 
1476349Sqs148142 #define	RDC_STAT_PEU_ERR_SHIFT			52	/* RO, bit 52 */
1486349Sqs148142 #define	RDC_STAT_PEU_ERR			0x0010000000000000ULL
1496349Sqs148142 #define	RDC_STAT_PEU_ERR_MASK			0x0010000000000000ULL
1506349Sqs148142 
1516349Sqs148142 #define	RDC_STAT_RBR_CPL_SHIFT			53	/* RO, bit 53 */
1526349Sqs148142 #define	RDC_STAT_RBR_CPL			0x0020000000000000ULL
1536349Sqs148142 #define	RDC_STAT_RBR_CPL_MASK			0x0020000000000000ULL
1546349Sqs148142 
1556349Sqs148142 #define	RDC_STAT_ERROR 				RDC_INT_MASK_ALL
1566349Sqs148142 
1576349Sqs148142 /* the following are write 1 to clear bits */
1586349Sqs148142 #define	RDC_STAT_WR1C		(RDC_STAT_RBREMPTY | 		\
1596349Sqs148142 				RDC_STAT_RCR_SHDW_FULL | 	\
1606349Sqs148142 				RDC_STAT_RBR_PRE_EMPTY | 	\
1616349Sqs148142 				RDC_STAT_RBR_PRE_PAR |		\
1626349Sqs148142 				RDC_STAT_RCR_SHA_PAR |		\
1636349Sqs148142 				RDC_STAT_RBR_CPL |		\
1646349Sqs148142 				RDC_STAT_PEU_ERR)
1656349Sqs148142 
1666349Sqs148142 typedef union _rcr_entry_t {
1676349Sqs148142 	uint64_t value;
1686349Sqs148142 	struct {
1696349Sqs148142 #if defined(_BIG_ENDIAN)
1706864Sqs148142 		uint32_t multi:1;
1716864Sqs148142 		uint32_t pkt_type:2;
1726864Sqs148142 		uint32_t reserved:3;
1736864Sqs148142 		uint32_t error:4;
1746864Sqs148142 		uint32_t l2_len:14;
1756864Sqs148142 		uint32_t pktbufsz:2;
1766864Sqs148142 		uint32_t pkt_buf_addr:6;
1776864Sqs148142 		uint32_t pkt_buf_addr_l:32;
1786349Sqs148142 #else
1796864Sqs148142 		uint32_t pkt_buf_addr_l:32;
1806864Sqs148142 		uint32_t pkt_buf_addr:6;
1816864Sqs148142 		uint32_t pktbufsz:2;
1826864Sqs148142 		uint32_t l2_len:14;
1836864Sqs148142 		uint32_t error:4;
1846864Sqs148142 		uint32_t reserved:3;
1856864Sqs148142 		uint32_t pkt_type:2;
1866864Sqs148142 		uint32_t multi:1;
1876349Sqs148142 #endif
1886349Sqs148142 	} bits;
1896349Sqs148142 } rcr_entry_t, *p_rcr_entry_t;
1906349Sqs148142 
1916349Sqs148142 #define	RX_DMA_MAILBOX_BYTE_LENGTH	64
1926349Sqs148142 
1936349Sqs148142 typedef struct _rxdma_mailbox_t {
1946349Sqs148142 	rdc_stat_t		rxdma_ctl_stat;		/* 8 bytes */
1956349Sqs148142 	rdc_rbr_qlen_t		rbr_stat;		/* 8 bytes */
1966349Sqs148142 	rdc_rbr_head_t		rbr_hdh;		/* 8 bytes */
1977465SMichael.Speer@Sun.COM 	uint64_t		resv_1;
1986349Sqs148142 	rdc_rcr_tail_t		rcrstat_c;		/* 8 bytes */
1997465SMichael.Speer@Sun.COM 	uint64_t		resv_2;
2006349Sqs148142 	rdc_rcr_qlen_t		rcrstat_a;		/* 8 bytes */
2017465SMichael.Speer@Sun.COM 	uint64_t		resv_3;
2026349Sqs148142 } rxdma_mailbox_t, *p_rxdma_mailbox_t;
2036349Sqs148142 
2046349Sqs148142 /*
2056349Sqs148142  * hardware workarounds: kick 16 (was 8 before)
2066349Sqs148142  */
2076349Sqs148142 #define	HXGE_RXDMA_POST_BATCH		16
2086349Sqs148142 
2096349Sqs148142 #define	RXBUF_START_ADDR(a, index, bsize)	((a & (index * bsize))
2106349Sqs148142 #define	RXBUF_OFFSET_FROM_START(a, start)	(start - a)
2116349Sqs148142 #define	RXBUF_64B_ALIGNED		64
2126349Sqs148142 
2136349Sqs148142 #define	HXGE_RXBUF_EXTRA		34
2146349Sqs148142 
2156349Sqs148142 /*
2166349Sqs148142  * Receive buffer thresholds and buffer types
2176349Sqs148142  */
2186349Sqs148142 #define	HXGE_RX_BCOPY_SCALE	8	/* use 1/8 as lowest granularity */
2196349Sqs148142 
2206349Sqs148142 typedef enum  {
2216349Sqs148142 	HXGE_RX_COPY_ALL = 0,		/* do bcopy on every packet	 */
2226349Sqs148142 	HXGE_RX_COPY_1,			/* bcopy on 1/8 of buffer posted */
2236349Sqs148142 	HXGE_RX_COPY_2,			/* bcopy on 2/8 of buffer posted */
2246349Sqs148142 	HXGE_RX_COPY_3,			/* bcopy on 3/8 of buffer posted */
2256349Sqs148142 	HXGE_RX_COPY_4,			/* bcopy on 4/8 of buffer posted */
2266349Sqs148142 	HXGE_RX_COPY_5,			/* bcopy on 5/8 of buffer posted */
2276349Sqs148142 	HXGE_RX_COPY_6,			/* bcopy on 6/8 of buffer posted */
2286349Sqs148142 	HXGE_RX_COPY_7,			/* bcopy on 7/8 of buffer posted */
2296349Sqs148142 	HXGE_RX_COPY_NONE		/* don't do bcopy at all	 */
2306349Sqs148142 } hxge_rxbuf_threshold_t;
2316349Sqs148142 
2326349Sqs148142 typedef enum  {
2336349Sqs148142 	HXGE_RBR_TYPE0 = RCR_PKTBUFSZ_0,  /* bcopy buffer size 0 (small) */
2346349Sqs148142 	HXGE_RBR_TYPE1 = RCR_PKTBUFSZ_1,  /* bcopy buffer size 1 (medium) */
2356349Sqs148142 	HXGE_RBR_TYPE2 = RCR_PKTBUFSZ_2	  /* bcopy buffer size 2 (large) */
2366349Sqs148142 } hxge_rxbuf_type_t;
2376349Sqs148142 
2386349Sqs148142 typedef	struct _rdc_errlog {
2396349Sqs148142 	rdc_pref_par_log_t	pre_par;
2406349Sqs148142 	rdc_pref_par_log_t	sha_par;
2416349Sqs148142 	uint8_t			compl_err_type;
2426349Sqs148142 } rdc_errlog_t;
2436349Sqs148142 
2446349Sqs148142 /*
2456349Sqs148142  * Receive  Statistics.
2466349Sqs148142  */
2476349Sqs148142 typedef struct _hxge_rx_ring_stats_t {
2486349Sqs148142 	uint64_t	ipackets;
2496349Sqs148142 	uint64_t	ibytes;
2506349Sqs148142 	uint32_t	ierrors;
2516349Sqs148142 	uint32_t	jumbo_pkts;
2526349Sqs148142 
2536349Sqs148142 	/*
2546349Sqs148142 	 * Error event stats.
2556349Sqs148142 	 */
2566349Sqs148142 	uint32_t	rcr_unknown_err;
2576349Sqs148142 	uint32_t	ctrl_fifo_ecc_err;
2586349Sqs148142 	uint32_t	data_fifo_ecc_err;
2596349Sqs148142 	uint32_t	rbr_tmout;		/* rbr_cpl_to */
2606349Sqs148142 	uint32_t 	peu_resp_err;		/* peu_resp_err */
2616349Sqs148142 	uint32_t 	rcr_sha_par;		/* rcr_shadow_par_err */
2626349Sqs148142 	uint32_t 	rbr_pre_par;		/* rbr_prefetch_par_err */
2636349Sqs148142 	uint32_t 	rbr_pre_empty;		/* rbr_pre_empty */
2646349Sqs148142 	uint32_t 	rcr_shadow_full;	/* rcr_shadow_full */
2656349Sqs148142 	uint32_t 	rcrfull;		/* rcr_full */
2666349Sqs148142 	uint32_t 	rbr_empty;		/* rbr_empty */
2678141SMichael.Speer@Sun.COM 	uint32_t 	rbr_empty_fail;		/* rbr_empty_fail */
2688236SQiyan.Sun@Sun.COM 	uint32_t 	rbr_empty_restore;	/* rbr_empty_restore */
2696349Sqs148142 	uint32_t 	rbrfull;		/* rbr_full */
2707618SMichael.Speer@Sun.COM 	/*
2717618SMichael.Speer@Sun.COM 	 * RCR invalids: when processing RCR entries, can
2727618SMichael.Speer@Sun.COM 	 * run into invalid RCR entries.  This counter provides
2737618SMichael.Speer@Sun.COM 	 * a means to account for invalid RCR entries.
2747618SMichael.Speer@Sun.COM 	 */
2757618SMichael.Speer@Sun.COM 	uint32_t 	rcr_invalids;		/* rcr invalids */
2766349Sqs148142 	uint32_t 	rcr_to;			/* rcr_to */
2776349Sqs148142 	uint32_t 	rcr_thres;		/* rcr_thres */
2788103SQiyan.Sun@Sun.COM 	/* Packets dropped in order to prevent rbr_empty condition */
2798103SQiyan.Sun@Sun.COM 	uint32_t 	pkt_drop;
2806349Sqs148142 	rdc_errlog_t	errlog;
2816349Sqs148142 } hxge_rx_ring_stats_t, *p_hxge_rx_ring_stats_t;
2826349Sqs148142 
2836349Sqs148142 typedef struct _hxge_rdc_sys_stats {
2846349Sqs148142 	uint32_t	ctrl_fifo_sec;
2856349Sqs148142 	uint32_t	ctrl_fifo_ded;
2866349Sqs148142 	uint32_t	data_fifo_sec;
2876349Sqs148142 	uint32_t	data_fifo_ded;
2886349Sqs148142 } hxge_rdc_sys_stats_t, *p_hxge_rdc_sys_stats_t;
2896349Sqs148142 
2906349Sqs148142 typedef struct _rx_msg_t {
2916349Sqs148142 	hxge_os_dma_common_t	buf_dma;
2926349Sqs148142 	hxge_os_mutex_t 	lock;
2936349Sqs148142 	struct _hxge_t		*hxgep;
2946349Sqs148142 	struct _rx_rbr_ring_t	*rx_rbr_p;
2956349Sqs148142 	boolean_t 		free;
2966349Sqs148142 	uint32_t 		ref_cnt;
2976349Sqs148142 	hxge_os_frtn_t 		freeb;
2986349Sqs148142 	size_t 			block_size;
2996349Sqs148142 	uint32_t		block_index;
3006349Sqs148142 	uint32_t 		pkt_buf_size;
3016349Sqs148142 	uint32_t 		pkt_buf_size_code;
3026349Sqs148142 	uint32_t		cur_usage_cnt;
3036349Sqs148142 	uint32_t		max_usage_cnt;
3046349Sqs148142 	uchar_t			*buffer;
3056349Sqs148142 	uint32_t 		pri;
3066349Sqs148142 	uint32_t 		shifted_addr;
3076349Sqs148142 	boolean_t		use_buf_pool;
3086349Sqs148142 	p_mblk_t 		rx_mblk_p;
3096349Sqs148142 	boolean_t		rx_use_bcopy;
3106349Sqs148142 } rx_msg_t, *p_rx_msg_t;
3116349Sqs148142 
3126349Sqs148142 /* Receive Completion Ring */
3136349Sqs148142 typedef struct _rx_rcr_ring_t {
3146349Sqs148142 	hxge_os_dma_common_t	rcr_desc;
3156349Sqs148142 	struct _hxge_t		*hxgep;
3168718SMichael.Speer@Sun.COM 	mac_ring_handle_t   	rcr_mac_handle;
3178718SMichael.Speer@Sun.COM 	uint64_t		rcr_gen_num;
3188718SMichael.Speer@Sun.COM 	boolean_t		poll_flag;
3198718SMichael.Speer@Sun.COM 	p_hxge_ldv_t		ldvp;
3208718SMichael.Speer@Sun.COM 	p_hxge_ldg_t		ldgp;
3216349Sqs148142 
3226349Sqs148142 	p_hxge_rx_ring_stats_t	rdc_stats;	/* pointer to real kstats */
3236349Sqs148142 
3246349Sqs148142 	rdc_rcr_cfg_a_t		rcr_cfga;
3256349Sqs148142 	rdc_rcr_cfg_b_t		rcr_cfgb;
3266349Sqs148142 
3276349Sqs148142 	hxge_os_mutex_t 	lock;
3286349Sqs148142 	uint16_t		index;
3296349Sqs148142 	uint16_t		rdc;
3306349Sqs148142 	boolean_t		full_hdr_flag;	 /* 1: 18 bytes header */
3316349Sqs148142 	uint16_t		sw_priv_hdr_len; /* 0 - 192 bytes (SW) */
3326349Sqs148142 	uint32_t 		comp_size;	 /* # of RCR entries */
3336349Sqs148142 	uint64_t		rcr_addr;
3346349Sqs148142 	uint_t 			comp_wrap_mask;
3356349Sqs148142 	uint_t 			comp_rd_index;
3366349Sqs148142 	uint_t 			comp_wt_index;
3376349Sqs148142 
3386349Sqs148142 	p_rcr_entry_t		rcr_desc_first_p;
3396349Sqs148142 	p_rcr_entry_t		rcr_desc_first_pp;
3406349Sqs148142 	p_rcr_entry_t		rcr_desc_last_p;
3416349Sqs148142 	p_rcr_entry_t		rcr_desc_last_pp;
3426349Sqs148142 
3436349Sqs148142 	p_rcr_entry_t		rcr_desc_rd_head_p;	/* software next read */
3446349Sqs148142 	p_rcr_entry_t		rcr_desc_rd_head_pp;
3457584SQiyan.Sun@Sun.COM 	uint64_t		rcr_tail_begin;
3466349Sqs148142 
3476349Sqs148142 	struct _rx_rbr_ring_t	*rx_rbr_p;
3486349Sqs148142 	uint32_t		intr_timeout;
3496349Sqs148142 	uint32_t		intr_threshold;
3506349Sqs148142 	uint32_t		rcvd_pkt_bytes; /* Received bytes of a packet */
3516349Sqs148142 } rx_rcr_ring_t, *p_rx_rcr_ring_t;
3526349Sqs148142 
3536349Sqs148142 
3546349Sqs148142 /* Buffer index information */
3556349Sqs148142 typedef struct _rxbuf_index_info_t {
3566349Sqs148142 	uint32_t		buf_index;
3576349Sqs148142 	uint32_t		start_index;
3586349Sqs148142 	uint32_t		buf_size;
3596349Sqs148142 	uint64_t		dvma_addr;
3606349Sqs148142 	uint64_t		kaddr;
3616349Sqs148142 } rxbuf_index_info_t, *p_rxbuf_index_info_t;
3626349Sqs148142 
3636349Sqs148142 /* Buffer index information */
3646349Sqs148142 
3656349Sqs148142 typedef struct _rxring_info_t {
366*11257SMichael.Speer@Sun.COM 	uint32_t		hint[N_PKTSIZE_TYPES];
3676349Sqs148142 	uint32_t		block_size_mask;
3686349Sqs148142 	uint16_t		max_iterations;
3696349Sqs148142 	rxbuf_index_info_t	buffer[HXGE_DMA_BLOCK];
3706349Sqs148142 } rxring_info_t, *p_rxring_info_t;
3716349Sqs148142 
3726349Sqs148142 
3736349Sqs148142 typedef enum {
3746349Sqs148142 	RBR_POSTING = 1,	/* We may post rx buffers. */
3756349Sqs148142 	RBR_UNMAPPING,		/* We are in the process of unmapping. */
3766349Sqs148142 	RBR_UNMAPPED		/* The ring is unmapped. */
3776349Sqs148142 } rbr_state_t;
3786349Sqs148142 
3796349Sqs148142 
3806349Sqs148142 /* Receive Buffer Block Ring */
3816349Sqs148142 typedef struct _rx_rbr_ring_t {
3826349Sqs148142 	hxge_os_dma_common_t	rbr_desc;
3836349Sqs148142 	p_rx_msg_t 		*rx_msg_ring;
3846349Sqs148142 	p_hxge_dma_common_t 	*dma_bufp;
3856349Sqs148142 	rdc_rbr_cfg_a_t		rbr_cfga;
3866349Sqs148142 	rdc_rbr_cfg_b_t		rbr_cfgb;
3876349Sqs148142 	rdc_rbr_kick_t		rbr_kick;
3886349Sqs148142 	rdc_page_handle_t	page_hdl;
3896349Sqs148142 
3906349Sqs148142 	hxge_os_mutex_t		lock;
3916349Sqs148142 	hxge_os_mutex_t		post_lock;
3928141SMichael.Speer@Sun.COM 	boolean_t		rbr_is_empty;
3938366SQiyan.Sun@Sun.COM 	uint32_t		rbr_used;
3946349Sqs148142 	uint16_t		index;
3956349Sqs148142 	struct _hxge_t		*hxgep;
3966349Sqs148142 	uint16_t		rdc;
3976349Sqs148142 	uint_t 			rbr_max_size;
3986349Sqs148142 	uint64_t		rbr_addr;
3996349Sqs148142 	uint_t 			rbr_wrap_mask;
4006349Sqs148142 	uint_t 			rbb_max;
4016349Sqs148142 	uint_t			block_size;
4026349Sqs148142 	uint_t			num_blocks;
4036349Sqs148142 	uint_t			tnblocks;
4046349Sqs148142 	uint_t			pkt_buf_size0;
4056349Sqs148142 	uint_t			pkt_buf_size0_bytes;
4066349Sqs148142 	uint_t			hpi_pkt_buf_size0;
4076349Sqs148142 	uint_t			pkt_buf_size1;
4086349Sqs148142 	uint_t			pkt_buf_size1_bytes;
4096349Sqs148142 	uint_t			hpi_pkt_buf_size1;
4106349Sqs148142 	uint_t			pkt_buf_size2;
4116349Sqs148142 	uint_t			pkt_buf_size2_bytes;
4126349Sqs148142 	uint_t			hpi_pkt_buf_size2;
4136349Sqs148142 
4146349Sqs148142 	uint64_t		rbr_head_pp;
4156349Sqs148142 	uint64_t		rbr_tail_pp;
4166349Sqs148142 	uint32_t		*rbr_desc_vp;
4176349Sqs148142 
4186349Sqs148142 	p_rx_rcr_ring_t		rx_rcr_p;
4196349Sqs148142 
4206349Sqs148142 	rdc_rbr_head_t		rbr_head;
4216349Sqs148142 	uint_t 			rbr_wr_index;
4226349Sqs148142 	uint_t 			rbr_rd_index;
4236349Sqs148142 	uint_t 			rbr_hw_head_index;
4246349Sqs148142 	uint64_t 		rbr_hw_head_ptr;
4256349Sqs148142 
4266349Sqs148142 	rxring_info_t		*ring_info;
4276349Sqs148142 	uint_t 			rbr_consumed;
4286349Sqs148142 	uint_t 			rbr_threshold_hi;
4296349Sqs148142 	uint_t 			rbr_threshold_lo;
4306349Sqs148142 	hxge_rxbuf_type_t	rbr_bufsize_type;
4316349Sqs148142 	boolean_t		rbr_use_bcopy;
4326349Sqs148142 
4336349Sqs148142 	/*
4346349Sqs148142 	 * <rbr_ref_cnt> is a count of those receive buffers which
4356349Sqs148142 	 * have been loaned to the kernel.  We will not free this
4366349Sqs148142 	 * ring until the reference count reaches zero (0).
4376349Sqs148142 	 */
4386349Sqs148142 	uint32_t		rbr_ref_cnt;
4396349Sqs148142 	rbr_state_t		rbr_state;	/* POSTING, etc */
4406349Sqs148142 } rx_rbr_ring_t, *p_rx_rbr_ring_t;
4416349Sqs148142 
4426349Sqs148142 /* Receive Mailbox */
4436349Sqs148142 typedef struct _rx_mbox_t {
4446349Sqs148142 	hxge_os_dma_common_t	rx_mbox;
4456349Sqs148142 	rdc_rx_cfg1_t		rx_cfg1;
4466349Sqs148142 	rdc_rx_cfg2_t		rx_cfg2;
4476349Sqs148142 	uint64_t		mbox_addr;
4486349Sqs148142 	boolean_t		cfg_set;
4496349Sqs148142 
4506349Sqs148142 	hxge_os_mutex_t 	lock;
4516349Sqs148142 	uint16_t		index;
4526349Sqs148142 	struct _hxge_t		*hxgep;
4536349Sqs148142 	uint16_t		rdc;
4546349Sqs148142 } rx_mbox_t, *p_rx_mbox_t;
4556349Sqs148142 
4566349Sqs148142 typedef struct _rx_rbr_rings_t {
4576349Sqs148142 	p_rx_rbr_ring_t 	*rbr_rings;
4586349Sqs148142 	uint32_t		ndmas;
4596349Sqs148142 	boolean_t		rxbuf_allocated;
4606349Sqs148142 } rx_rbr_rings_t, *p_rx_rbr_rings_t;
4616349Sqs148142 
4626349Sqs148142 typedef struct _rx_rcr_rings_t {
4636349Sqs148142 	p_rx_rcr_ring_t 	*rcr_rings;
4646349Sqs148142 	uint32_t		ndmas;
4656349Sqs148142 	boolean_t		cntl_buf_allocated;
4666349Sqs148142 } rx_rcr_rings_t, *p_rx_rcr_rings_t;
4676349Sqs148142 
4686349Sqs148142 typedef struct _rx_mbox_areas_t {
4696349Sqs148142 	p_rx_mbox_t 		*rxmbox_areas;
4706349Sqs148142 	uint32_t		ndmas;
4716349Sqs148142 	boolean_t		mbox_allocated;
4726349Sqs148142 } rx_mbox_areas_t, *p_rx_mbox_areas_t;
4736349Sqs148142 
4746349Sqs148142 /*
4756349Sqs148142  * Receive DMA Prototypes.
4766349Sqs148142  */
4776349Sqs148142 hxge_status_t hxge_init_rxdma_channels(p_hxge_t hxgep);
4786349Sqs148142 void hxge_uninit_rxdma_channels(p_hxge_t hxgep);
4796349Sqs148142 hxge_status_t hxge_init_rxdma_channel_cntl_stat(p_hxge_t hxgep,
4806349Sqs148142 	uint16_t channel, rdc_stat_t *cs_p);
4816349Sqs148142 hxge_status_t hxge_enable_rxdma_channel(p_hxge_t hxgep,
4826349Sqs148142 	uint16_t channel, p_rx_rbr_ring_t rbr_p, p_rx_rcr_ring_t rcr_p,
4838103SQiyan.Sun@Sun.COM 	p_rx_mbox_t mbox_p, int n_init_kick);
4846349Sqs148142 hxge_status_t hxge_rxdma_hw_mode(p_hxge_t hxgep, boolean_t enable);
4856349Sqs148142 int hxge_rxdma_get_ring_index(p_hxge_t hxgep, uint16_t channel);
4866349Sqs148142 hxge_status_t hxge_rxdma_handle_sys_errors(p_hxge_t hxgep);
4876349Sqs148142 
4888718SMichael.Speer@Sun.COM extern int hxge_enable_poll(void *arg);
4898718SMichael.Speer@Sun.COM extern int hxge_disable_poll(void *arg);
4908718SMichael.Speer@Sun.COM extern mblk_t *hxge_rx_poll(void *arg, int bytes_to_read);
4918718SMichael.Speer@Sun.COM 
4926349Sqs148142 
4936349Sqs148142 #ifdef	__cplusplus
4946349Sqs148142 }
4956349Sqs148142 #endif
4966349Sqs148142 
4976349Sqs148142 #endif	/* _SYS_HXGE_HXGE_RXDMA_H */
498