xref: /titanic_51/usr/src/uts/common/sys/nxge/nxge_rxdma.h (revision 0dc2366f7b9f9f36e10909b1e95edbf2a261c2ac)
16f45ec7bSml29623 /*
26f45ec7bSml29623  * CDDL HEADER START
36f45ec7bSml29623  *
46f45ec7bSml29623  * The contents of this file are subject to the terms of the
56f45ec7bSml29623  * Common Development and Distribution License (the "License").
66f45ec7bSml29623  * You may not use this file except in compliance with the License.
76f45ec7bSml29623  *
86f45ec7bSml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96f45ec7bSml29623  * or http://www.opensolaris.org/os/licensing.
106f45ec7bSml29623  * See the License for the specific language governing permissions
116f45ec7bSml29623  * and limitations under the License.
126f45ec7bSml29623  *
136f45ec7bSml29623  * When distributing Covered Code, include this CDDL HEADER in each
146f45ec7bSml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156f45ec7bSml29623  * If applicable, add the following below this CDDL HEADER, with the
166f45ec7bSml29623  * fields enclosed by brackets "[]" replaced with your own identifying
176f45ec7bSml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
186f45ec7bSml29623  *
196f45ec7bSml29623  * CDDL HEADER END
206f45ec7bSml29623  */
213587e8e2SMichael Speer 
226f45ec7bSml29623 /*
23*0dc2366fSVenugopal Iyer  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
246f45ec7bSml29623  * Use is subject to license terms.
256f45ec7bSml29623  */
266f45ec7bSml29623 
276f45ec7bSml29623 #ifndef	_SYS_NXGE_NXGE_RXDMA_H
286f45ec7bSml29623 #define	_SYS_NXGE_NXGE_RXDMA_H
296f45ec7bSml29623 
306f45ec7bSml29623 #ifdef	__cplusplus
316f45ec7bSml29623 extern "C" {
326f45ec7bSml29623 #endif
336f45ec7bSml29623 
346f45ec7bSml29623 #include <sys/nxge/nxge_rxdma_hw.h>
356f45ec7bSml29623 #include <npi_rxdma.h>
366f45ec7bSml29623 
376f45ec7bSml29623 #define	RXDMA_CK_DIV_DEFAULT		7500 	/* 25 usec */
386f45ec7bSml29623 /*
396f45ec7bSml29623  * Hardware RDC designer: 8 cache lines during Atlas bringup.
406f45ec7bSml29623  */
416f45ec7bSml29623 #define	RXDMA_RED_LESS_BYTES		(8 * 64) /* 8 cache line */
426f45ec7bSml29623 #define	RXDMA_RED_LESS_ENTRIES		(RXDMA_RED_LESS_BYTES/8)
436f45ec7bSml29623 #define	RXDMA_RED_WINDOW_DEFAULT	0
446f45ec7bSml29623 #define	RXDMA_RED_THRES_DEFAULT		0
456f45ec7bSml29623 
466f45ec7bSml29623 #define	RXDMA_RCR_PTHRES_DEFAULT	0x20
476f45ec7bSml29623 #define	RXDMA_RCR_TO_DEFAULT		0x8
486f45ec7bSml29623 
496f45ec7bSml29623 /*
506f45ec7bSml29623  * hardware workarounds: kick 16 (was 8 before)
516f45ec7bSml29623  */
526f45ec7bSml29623 #define	NXGE_RXDMA_POST_BATCH		16
536f45ec7bSml29623 
546f45ec7bSml29623 #define	RXBUF_START_ADDR(a, index, bsize)	((a & (index * bsize))
556f45ec7bSml29623 #define	RXBUF_OFFSET_FROM_START(a, start)	(start - a)
566f45ec7bSml29623 #define	RXBUF_64B_ALIGNED		64
576f45ec7bSml29623 
586f45ec7bSml29623 #define	NXGE_RXBUF_EXTRA		34
596f45ec7bSml29623 /*
606f45ec7bSml29623  * Receive buffer thresholds and buffer types
616f45ec7bSml29623  */
626f45ec7bSml29623 #define	NXGE_RX_BCOPY_SCALE	8	/* use 1/8 as lowest granularity */
636f45ec7bSml29623 typedef enum  {
646f45ec7bSml29623 	NXGE_RX_COPY_ALL = 0,		/* do bcopy on every packet	 */
656f45ec7bSml29623 	NXGE_RX_COPY_1,			/* bcopy on 1/8 of buffer posted */
666f45ec7bSml29623 	NXGE_RX_COPY_2,			/* bcopy on 2/8 of buffer posted */
676f45ec7bSml29623 	NXGE_RX_COPY_3,			/* bcopy on 3/8 of buffer posted */
686f45ec7bSml29623 	NXGE_RX_COPY_4,			/* bcopy on 4/8 of buffer posted */
696f45ec7bSml29623 	NXGE_RX_COPY_5,			/* bcopy on 5/8 of buffer posted */
706f45ec7bSml29623 	NXGE_RX_COPY_6,			/* bcopy on 6/8 of buffer posted */
716f45ec7bSml29623 	NXGE_RX_COPY_7,			/* bcopy on 7/8 of buffer posted */
726f45ec7bSml29623 	NXGE_RX_COPY_NONE		/* don't do bcopy at all	 */
736f45ec7bSml29623 } nxge_rxbuf_threshold_t;
746f45ec7bSml29623 
756f45ec7bSml29623 typedef enum  {
766f45ec7bSml29623 	NXGE_RBR_TYPE0 = RCR_PKTBUFSZ_0,  /* bcopy buffer size 0 (small) */
776f45ec7bSml29623 	NXGE_RBR_TYPE1 = RCR_PKTBUFSZ_1,  /* bcopy buffer size 1 (medium) */
786f45ec7bSml29623 	NXGE_RBR_TYPE2 = RCR_PKTBUFSZ_2	  /* bcopy buffer size 2 (large) */
796f45ec7bSml29623 } nxge_rxbuf_type_t;
806f45ec7bSml29623 
816f45ec7bSml29623 typedef	struct _rdc_errlog {
826f45ec7bSml29623 	rdmc_par_err_log_t	pre_par;
836f45ec7bSml29623 	rdmc_par_err_log_t	sha_par;
846f45ec7bSml29623 	uint8_t			compl_err_type;
856f45ec7bSml29623 } rdc_errlog_t;
866f45ec7bSml29623 
876f45ec7bSml29623 /*
886f45ec7bSml29623  * Receive  Statistics.
896f45ec7bSml29623  */
906f45ec7bSml29623 typedef struct _nxge_rx_ring_stats_t {
916f45ec7bSml29623 	uint64_t	ipackets;
926f45ec7bSml29623 	uint64_t	ibytes;
936f45ec7bSml29623 	uint32_t	ierrors;
946f45ec7bSml29623 	uint32_t	multircv;
956f45ec7bSml29623 	uint32_t	brdcstrcv;
966f45ec7bSml29623 	uint32_t	norcvbuf;
976f45ec7bSml29623 
986f45ec7bSml29623 	uint32_t	rx_inits;
996f45ec7bSml29623 	uint32_t	rx_jumbo_pkts;
1006f45ec7bSml29623 	uint32_t	rx_multi_pkts;
1016f45ec7bSml29623 	uint32_t	rx_mtu_pkts;
1026f45ec7bSml29623 	uint32_t	rx_no_buf;
1036f45ec7bSml29623 
1046f45ec7bSml29623 	/*
1056f45ec7bSml29623 	 * Receive buffer management statistics.
1066f45ec7bSml29623 	 */
1076f45ec7bSml29623 	uint32_t	rx_new_pages;
1086f45ec7bSml29623 	uint32_t	rx_new_mtu_pgs;
1096f45ec7bSml29623 	uint32_t	rx_new_nxt_pgs;
1106f45ec7bSml29623 	uint32_t	rx_reused_pgs;
1116f45ec7bSml29623 	uint32_t	rx_mtu_drops;
1126f45ec7bSml29623 	uint32_t	rx_nxt_drops;
1136f45ec7bSml29623 
1146f45ec7bSml29623 	/*
1156f45ec7bSml29623 	 * Error event stats.
1166f45ec7bSml29623 	 */
1176f45ec7bSml29623 	uint32_t	rx_rbr_tmout;
1184202ea4bSsbehera 	uint32_t	pkt_too_long_err;
1196f45ec7bSml29623 	uint32_t	l2_err;
1206f45ec7bSml29623 	uint32_t	l4_cksum_err;
1216f45ec7bSml29623 	uint32_t	fflp_soft_err;
1226f45ec7bSml29623 	uint32_t	zcp_soft_err;
12353f3d8ecSyc148097 	uint32_t	rcr_unknown_err;
1246f45ec7bSml29623 	uint32_t	dcf_err;
1256f45ec7bSml29623 	uint32_t 	rbr_tmout;
1266f45ec7bSml29623 	uint32_t 	rsp_cnt_err;
1276f45ec7bSml29623 	uint32_t 	byte_en_err;
1286f45ec7bSml29623 	uint32_t 	byte_en_bus;
1296f45ec7bSml29623 	uint32_t 	rsp_dat_err;
1306f45ec7bSml29623 	uint32_t 	rcr_ack_err;
1316f45ec7bSml29623 	uint32_t 	dc_fifo_err;
1326f45ec7bSml29623 	uint32_t 	rcr_sha_par;
1336f45ec7bSml29623 	uint32_t 	rbr_pre_par;
1346f45ec7bSml29623 	uint32_t 	port_drop_pkt;
1356f45ec7bSml29623 	uint32_t 	wred_drop;
1366f45ec7bSml29623 	uint32_t 	rbr_pre_empty;
1376f45ec7bSml29623 	uint32_t 	rcr_shadow_full;
1386f45ec7bSml29623 	uint32_t 	config_err;
1396f45ec7bSml29623 	uint32_t 	rcrincon;
1406f45ec7bSml29623 	uint32_t 	rcrfull;
1416f45ec7bSml29623 	uint32_t 	rbr_empty;
1426f45ec7bSml29623 	uint32_t 	rbrfull;
1436f45ec7bSml29623 	uint32_t 	rbrlogpage;
1446f45ec7bSml29623 	uint32_t 	cfiglogpage;
1456f45ec7bSml29623 	uint32_t 	rcrto;
1466f45ec7bSml29623 	uint32_t 	rcrthres;
1476f45ec7bSml29623 	uint32_t 	mex;
1486f45ec7bSml29623 	rdc_errlog_t	errlog;
1496f45ec7bSml29623 } nxge_rx_ring_stats_t, *p_nxge_rx_ring_stats_t;
1506f45ec7bSml29623 
1516f45ec7bSml29623 typedef struct _nxge_rdc_sys_stats {
1526f45ec7bSml29623 	uint32_t	pre_par;
1536f45ec7bSml29623 	uint32_t	sha_par;
1546f45ec7bSml29623 	uint32_t	id_mismatch;
1556f45ec7bSml29623 	uint32_t	ipp_eop_err;
1566f45ec7bSml29623 	uint32_t	zcp_eop_err;
1576f45ec7bSml29623 } nxge_rdc_sys_stats_t, *p_nxge_rdc_sys_stats_t;
1586f45ec7bSml29623 
159da14cebeSEric Cheng /*
160da14cebeSEric Cheng  * Software reserved buffer offset
161da14cebeSEric Cheng  */
162da14cebeSEric Cheng typedef struct _nxge_rxbuf_off_hdr_t {
163da14cebeSEric Cheng 	uint32_t		index;
164da14cebeSEric Cheng } nxge_rxbuf_off_hdr_t, *p_nxge_rxbuf_off_hdr_t;
165da14cebeSEric Cheng 
1666f45ec7bSml29623 
1676f45ec7bSml29623 typedef struct _rx_msg_t {
1686f45ec7bSml29623 	nxge_os_dma_common_t	buf_dma;
1696f45ec7bSml29623 	nxge_os_mutex_t 	lock;
1706f45ec7bSml29623 	struct _nxge_t		*nxgep;
1716f45ec7bSml29623 	struct _rx_rbr_ring_t	*rx_rbr_p;
1726f45ec7bSml29623 	boolean_t 		spare_in_use;
1736f45ec7bSml29623 	boolean_t 		free;
1746f45ec7bSml29623 	uint32_t 		ref_cnt;
1756f45ec7bSml29623 #ifdef RXBUFF_USE_SEPARATE_UP_CNTR
1766f45ec7bSml29623 	uint32_t 		pass_up_cnt;
1776f45ec7bSml29623 	boolean_t 		release;
1786f45ec7bSml29623 #endif
1796f45ec7bSml29623 	nxge_os_frtn_t 		freeb;
1806f45ec7bSml29623 	size_t 			bytes_arrived;
1816f45ec7bSml29623 	size_t 			bytes_expected;
1826f45ec7bSml29623 	size_t 			block_size;
1836f45ec7bSml29623 	uint32_t		block_index;
1846f45ec7bSml29623 	uint32_t 		pkt_buf_size;
1856f45ec7bSml29623 	uint32_t 		pkt_buf_size_code;
1866f45ec7bSml29623 	uint32_t 		max_pkt_bufs;
1876f45ec7bSml29623 	uint32_t		cur_usage_cnt;
1886f45ec7bSml29623 	uint32_t		max_usage_cnt;
1896f45ec7bSml29623 	uchar_t			*buffer;
1906f45ec7bSml29623 	uint32_t 		pri;
1916f45ec7bSml29623 	uint32_t 		shifted_addr;
1926f45ec7bSml29623 	boolean_t		use_buf_pool;
1936f45ec7bSml29623 	p_mblk_t 		rx_mblk_p;
1946f45ec7bSml29623 	boolean_t		rx_use_bcopy;
1956f45ec7bSml29623 } rx_msg_t, *p_rx_msg_t;
1966f45ec7bSml29623 
1976f45ec7bSml29623 typedef struct _rx_dma_handle_t {
1986f45ec7bSml29623 	nxge_os_dma_handle_t	dma_handle;	/* DMA handle	*/
1996f45ec7bSml29623 	nxge_os_acc_handle_t	acc_handle;	/* DMA memory handle */
2006f45ec7bSml29623 	npi_handle_t		npi_handle;
2016f45ec7bSml29623 } rx_dma_handle_t, *p_rx_dma_handle_t;
2026f45ec7bSml29623 
2036f45ec7bSml29623 
2046f45ec7bSml29623 /* Receive Completion Ring */
2056f45ec7bSml29623 typedef struct _rx_rcr_ring_t {
2066f45ec7bSml29623 	nxge_os_dma_common_t	rcr_desc;
2076f45ec7bSml29623 
2086f45ec7bSml29623 	struct _nxge_t		*nxgep;
2096f45ec7bSml29623 
2106f45ec7bSml29623 	p_nxge_rx_ring_stats_t	rdc_stats;
2116f45ec7bSml29623 
212*0dc2366fSVenugopal Iyer 	boolean_t		poll_flag;	/* B_TRUE, if polling mode */
213678453a8Sspeer 
2146f45ec7bSml29623 	rcrcfig_a_t		rcr_cfga;
2156f45ec7bSml29623 	rcrcfig_b_t		rcr_cfgb;
2166f45ec7bSml29623 
2176f45ec7bSml29623 	nxge_os_mutex_t 	lock;
2186f45ec7bSml29623 	uint16_t		index;
2196f45ec7bSml29623 	uint16_t		rdc;
2206f45ec7bSml29623 	boolean_t		full_hdr_flag;	 /* 1: 18 bytes header */
2216f45ec7bSml29623 	uint16_t		sw_priv_hdr_len; /* 0 - 192 bytes (SW) */
2226f45ec7bSml29623 	uint32_t 		comp_size;	 /* # of RCR entries */
2236f45ec7bSml29623 	uint64_t		rcr_addr;
2246f45ec7bSml29623 	uint_t 			comp_wrap_mask;
2256f45ec7bSml29623 	uint_t 			comp_rd_index;
2266f45ec7bSml29623 	uint_t 			comp_wt_index;
2276f45ec7bSml29623 
2286f45ec7bSml29623 	p_rcr_entry_t		rcr_desc_first_p;
2296f45ec7bSml29623 	p_rcr_entry_t		rcr_desc_first_pp;
2306f45ec7bSml29623 	p_rcr_entry_t		rcr_desc_last_p;
2316f45ec7bSml29623 	p_rcr_entry_t		rcr_desc_last_pp;
2326f45ec7bSml29623 
2336f45ec7bSml29623 	p_rcr_entry_t		rcr_desc_rd_head_p;	/* software next read */
2346f45ec7bSml29623 	p_rcr_entry_t		rcr_desc_rd_head_pp;
2356f45ec7bSml29623 
2366f45ec7bSml29623 	uint64_t		rcr_tail_pp;
2376f45ec7bSml29623 	uint64_t		rcr_head_pp;
2386f45ec7bSml29623 	struct _rx_rbr_ring_t	*rx_rbr_p;
2396f45ec7bSml29623 	uint32_t		intr_timeout;
2406f45ec7bSml29623 	uint32_t		intr_threshold;
2416f45ec7bSml29623 	uint64_t		max_receive_pkts;
242da14cebeSEric Cheng 	mac_ring_handle_t	rcr_mac_handle;
243da14cebeSEric Cheng 	uint64_t		rcr_gen_num;
2446f45ec7bSml29623 	uint32_t		rcvd_pkt_bytes; /* Received bytes of a packet */
245da14cebeSEric Cheng 	p_nxge_ldv_t		ldvp;
246da14cebeSEric Cheng 	p_nxge_ldg_t		ldgp;
247*0dc2366fSVenugopal Iyer 	boolean_t		started;
2486f45ec7bSml29623 } rx_rcr_ring_t, *p_rx_rcr_ring_t;
2496f45ec7bSml29623 
2506f45ec7bSml29623 
2516f45ec7bSml29623 
2526f45ec7bSml29623 /* Buffer index information */
2536f45ec7bSml29623 typedef struct _rxbuf_index_info_t {
2546f45ec7bSml29623 	uint32_t buf_index;
2556f45ec7bSml29623 	uint32_t start_index;
2566f45ec7bSml29623 	uint32_t buf_size;
2576f45ec7bSml29623 	uint64_t dvma_addr;
2586f45ec7bSml29623 	uint64_t kaddr;
2596f45ec7bSml29623 } rxbuf_index_info_t, *p_rxbuf_index_info_t;
2606f45ec7bSml29623 
261290b5530SMichael Speer /*
262290b5530SMichael Speer  * Buffer index information
263290b5530SMichael Speer  */
2646f45ec7bSml29623 typedef struct _rxring_info_t {
265290b5530SMichael Speer 	uint32_t hint[RCR_N_PKTBUF_SZ];
2666f45ec7bSml29623 	uint32_t block_size_mask;
2676f45ec7bSml29623 	uint16_t max_iterations;
2686f45ec7bSml29623 	rxbuf_index_info_t buffer[NXGE_DMA_BLOCK];
2696f45ec7bSml29623 } rxring_info_t, *p_rxring_info_t;
2706f45ec7bSml29623 
2716f45ec7bSml29623 
272007969e0Stm144005 typedef enum {
273007969e0Stm144005 	RBR_POSTING = 1,	/* We may post rx buffers. */
274007969e0Stm144005 	RBR_UNMAPPING,		/* We are in the process of unmapping. */
275007969e0Stm144005 	RBR_UNMAPPED		/* The ring is unmapped. */
276007969e0Stm144005 } rbr_state_t;
277007969e0Stm144005 
278007969e0Stm144005 
2796f45ec7bSml29623 /* Receive Buffer Block Ring */
2806f45ec7bSml29623 typedef struct _rx_rbr_ring_t {
2816f45ec7bSml29623 	nxge_os_dma_common_t	rbr_desc;
2826f45ec7bSml29623 	p_rx_msg_t 		*rx_msg_ring;
2836f45ec7bSml29623 	p_nxge_dma_common_t 	*dma_bufp;
2846f45ec7bSml29623 	rbr_cfig_a_t		rbr_cfga;
2856f45ec7bSml29623 	rbr_cfig_b_t		rbr_cfgb;
2866f45ec7bSml29623 	rbr_kick_t		rbr_kick;
2876f45ec7bSml29623 	log_page_vld_t		page_valid;
2886f45ec7bSml29623 	log_page_mask_t		page_mask_1;
2896f45ec7bSml29623 	log_page_mask_t		page_mask_2;
2906f45ec7bSml29623 	log_page_value_t	page_value_1;
2916f45ec7bSml29623 	log_page_value_t	page_value_2;
2926f45ec7bSml29623 	log_page_relo_t		page_reloc_1;
2936f45ec7bSml29623 	log_page_relo_t		page_reloc_2;
2946f45ec7bSml29623 	log_page_hdl_t		page_hdl;
2956f45ec7bSml29623 
2966f45ec7bSml29623 	boolean_t		cfg_set;
2976f45ec7bSml29623 
2986f45ec7bSml29623 	nxge_os_mutex_t		lock;
2996f45ec7bSml29623 	nxge_os_mutex_t		post_lock;
3006f45ec7bSml29623 	uint16_t		index;
3016f45ec7bSml29623 	struct _nxge_t		*nxgep;
3026f45ec7bSml29623 	uint16_t		rdc;
3036f45ec7bSml29623 	uint16_t		rdc_grp_id;
3046f45ec7bSml29623 	uint_t 			rbr_max_size;
3056f45ec7bSml29623 	uint64_t		rbr_addr;
3066f45ec7bSml29623 	uint_t 			rbr_wrap_mask;
3076f45ec7bSml29623 	uint_t 			rbb_max;
3086f45ec7bSml29623 	uint_t 			rbb_added;
3096f45ec7bSml29623 	uint_t			block_size;
3106f45ec7bSml29623 	uint_t			num_blocks;
3116f45ec7bSml29623 	uint_t			tnblocks;
3126f45ec7bSml29623 	uint_t			pkt_buf_size0;
3136f45ec7bSml29623 	uint_t			pkt_buf_size0_bytes;
3146f45ec7bSml29623 	uint_t			npi_pkt_buf_size0;
3156f45ec7bSml29623 	uint_t			pkt_buf_size1;
3166f45ec7bSml29623 	uint_t			pkt_buf_size1_bytes;
3176f45ec7bSml29623 	uint_t			npi_pkt_buf_size1;
3186f45ec7bSml29623 	uint_t			pkt_buf_size2;
3196f45ec7bSml29623 	uint_t			pkt_buf_size2_bytes;
3206f45ec7bSml29623 	uint_t			npi_pkt_buf_size2;
3216f45ec7bSml29623 
3226f45ec7bSml29623 	uint32_t		*rbr_desc_vp;
3236f45ec7bSml29623 
3246f45ec7bSml29623 	p_rx_rcr_ring_t		rx_rcr_p;
3256f45ec7bSml29623 
3266f45ec7bSml29623 	uint_t 			rbr_wr_index;
3276f45ec7bSml29623 	uint_t 			rbr_rd_index;
3286f45ec7bSml29623 
3296f45ec7bSml29623 	rxring_info_t  *ring_info;
3306f45ec7bSml29623 #if	defined(sun4v) && defined(NIU_LP_WORKAROUND)
3316f45ec7bSml29623 	uint64_t		hv_rx_buf_base_ioaddr_pp;
3326f45ec7bSml29623 	uint64_t		hv_rx_buf_ioaddr_size;
3336f45ec7bSml29623 	uint64_t		hv_rx_cntl_base_ioaddr_pp;
3346f45ec7bSml29623 	uint64_t		hv_rx_cntl_ioaddr_size;
3356f45ec7bSml29623 	boolean_t		hv_set;
3366f45ec7bSml29623 #endif
3376f45ec7bSml29623 	uint_t 			rbr_consumed;
3386f45ec7bSml29623 	uint_t 			rbr_threshold_hi;
3396f45ec7bSml29623 	uint_t 			rbr_threshold_lo;
3406f45ec7bSml29623 	nxge_rxbuf_type_t	rbr_bufsize_type;
3416f45ec7bSml29623 	boolean_t		rbr_use_bcopy;
342007969e0Stm144005 
343007969e0Stm144005 	/*
344007969e0Stm144005 	 * <rbr_ref_cnt> is a count of those receive buffers which
345007969e0Stm144005 	 * have been loaned to the kernel.  We will not free this
346007969e0Stm144005 	 * ring until the reference count reaches zero (0).
347007969e0Stm144005 	 */
348007969e0Stm144005 	uint32_t		rbr_ref_cnt;
349007969e0Stm144005 	rbr_state_t		rbr_state; /* POSTING, etc */
350678453a8Sspeer 	/*
351678453a8Sspeer 	 * Receive buffer allocation types:
352678453a8Sspeer 	 *   ddi_dma_mem_alloc(), contig_mem_alloc(), kmem_alloc()
353678453a8Sspeer 	 */
354678453a8Sspeer 	buf_alloc_type_t	rbr_alloc_type;
3556f45ec7bSml29623 } rx_rbr_ring_t, *p_rx_rbr_ring_t;
3566f45ec7bSml29623 
3576f45ec7bSml29623 /* Receive Mailbox */
3586f45ec7bSml29623 typedef struct _rx_mbox_t {
3596f45ec7bSml29623 	nxge_os_dma_common_t	rx_mbox;
3606f45ec7bSml29623 	rxdma_cfig1_t		rx_cfg1;
3616f45ec7bSml29623 	rxdma_cfig2_t		rx_cfg2;
3626f45ec7bSml29623 	uint64_t		mbox_addr;
3636f45ec7bSml29623 	boolean_t		cfg_set;
3646f45ec7bSml29623 
3656f45ec7bSml29623 	nxge_os_mutex_t 	lock;
3666f45ec7bSml29623 	uint16_t		index;
3676f45ec7bSml29623 	struct _nxge_t		*nxgep;
3686f45ec7bSml29623 	uint16_t		rdc;
3696f45ec7bSml29623 } rx_mbox_t, *p_rx_mbox_t;
3706f45ec7bSml29623 
3716f45ec7bSml29623 
3726f45ec7bSml29623 typedef struct _rx_rbr_rings_t {
3736f45ec7bSml29623 	p_rx_rbr_ring_t 	*rbr_rings;
3746f45ec7bSml29623 	uint32_t		ndmas;
375da14cebeSEric Cheng 	boolean_t		rxbuf_allocated;
3766f45ec7bSml29623 } rx_rbr_rings_t, *p_rx_rbr_rings_t;
3776f45ec7bSml29623 
3786f45ec7bSml29623 typedef struct _rx_rcr_rings_t {
3796f45ec7bSml29623 	p_rx_rcr_ring_t 	*rcr_rings;
3806f45ec7bSml29623 	uint32_t		ndmas;
381da14cebeSEric Cheng 	boolean_t		cntl_buf_allocated;
3826f45ec7bSml29623 } rx_rcr_rings_t, *p_rx_rcr_rings_t;
3836f45ec7bSml29623 
3846f45ec7bSml29623 typedef struct _rx_mbox_areas_t {
3856f45ec7bSml29623 	p_rx_mbox_t 		*rxmbox_areas;
3866f45ec7bSml29623 	uint32_t		ndmas;
3876f45ec7bSml29623 	boolean_t		mbox_allocated;
3886f45ec7bSml29623 } rx_mbox_areas_t, *p_rx_mbox_areas_t;
3896f45ec7bSml29623 
3906f45ec7bSml29623 /*
3916f45ec7bSml29623  * Global register definitions per chip and they are initialized
3926f45ec7bSml29623  * using the function zero control registers.
3936f45ec7bSml29623  * .
3946f45ec7bSml29623  */
3956f45ec7bSml29623 
3966f45ec7bSml29623 typedef struct _rxdma_globals {
3976f45ec7bSml29623 	boolean_t		mode32;
3986f45ec7bSml29623 	uint16_t		rxdma_ck_div_cnt;
3996f45ec7bSml29623 	uint16_t		rxdma_red_ran_init;
4006f45ec7bSml29623 	uint32_t		rxdma_eing_timeout;
4016f45ec7bSml29623 } rxdma_globals_t, *p_rxdma_globals;
4026f45ec7bSml29623 
4036f45ec7bSml29623 
4046f45ec7bSml29623 /*
4056f45ec7bSml29623  * Receive DMA Prototypes.
4066f45ec7bSml29623  */
4076f45ec7bSml29623 nxge_status_t nxge_init_rxdma_channels(p_nxge_t);
4086f45ec7bSml29623 void nxge_uninit_rxdma_channels(p_nxge_t);
409678453a8Sspeer 
410678453a8Sspeer nxge_status_t nxge_init_rxdma_channel(p_nxge_t, int);
411678453a8Sspeer void nxge_uninit_rxdma_channel(p_nxge_t, int);
412678453a8Sspeer 
413678453a8Sspeer nxge_status_t nxge_init_rxdma_channel_rcrflush(p_nxge_t, uint8_t);
4146f45ec7bSml29623 nxge_status_t nxge_reset_rxdma_channel(p_nxge_t, uint16_t);
4156f45ec7bSml29623 nxge_status_t nxge_init_rxdma_channel_cntl_stat(p_nxge_t,
4166f45ec7bSml29623 	uint16_t, p_rx_dma_ctl_stat_t);
4176f45ec7bSml29623 nxge_status_t nxge_enable_rxdma_channel(p_nxge_t,
4186f45ec7bSml29623 	uint16_t, p_rx_rbr_ring_t, p_rx_rcr_ring_t,
4196f45ec7bSml29623 	p_rx_mbox_t);
4206f45ec7bSml29623 nxge_status_t nxge_init_rxdma_channel_event_mask(p_nxge_t,
4216f45ec7bSml29623 		uint16_t, p_rx_dma_ent_msk_t);
4226f45ec7bSml29623 
4236f45ec7bSml29623 nxge_status_t nxge_rxdma_hw_mode(p_nxge_t, boolean_t);
4246f45ec7bSml29623 void nxge_hw_start_rx(p_nxge_t);
4256f45ec7bSml29623 void nxge_fixup_rxdma_rings(p_nxge_t);
4266f45ec7bSml29623 nxge_status_t nxge_dump_rxdma_channel(p_nxge_t, uint8_t);
4276f45ec7bSml29623 
4286f45ec7bSml29623 void nxge_rxdma_fix_channel(p_nxge_t, uint16_t);
4296f45ec7bSml29623 
430da14cebeSEric Cheng mblk_t *nxge_rx_poll(void *, int);
431da14cebeSEric Cheng int nxge_enable_poll(void *);
432da14cebeSEric Cheng int nxge_disable_poll(void *);
433da14cebeSEric Cheng 
4346f45ec7bSml29623 void nxge_rxdma_regs_dump_channels(p_nxge_t);
4356f45ec7bSml29623 nxge_status_t nxge_rxdma_handle_sys_errors(p_nxge_t);
4366f45ec7bSml29623 void nxge_rxdma_inject_err(p_nxge_t, uint32_t, uint8_t);
4376f45ec7bSml29623 
438678453a8Sspeer extern nxge_status_t nxge_alloc_rx_mem_pool(p_nxge_t);
439678453a8Sspeer extern nxge_status_t nxge_alloc_rxb(p_nxge_t nxgep, int channel);
440678453a8Sspeer extern void nxge_free_rxb(p_nxge_t nxgep, int channel);
4416f45ec7bSml29623 
442da14cebeSEric Cheng int nxge_get_rxring_index(p_nxge_t, int, int);
443da14cebeSEric Cheng 
4446f45ec7bSml29623 #ifdef	__cplusplus
4456f45ec7bSml29623 }
4466f45ec7bSml29623 #endif
4476f45ec7bSml29623 
4486f45ec7bSml29623 #endif	/* _SYS_NXGE_NXGE_RXDMA_H */
449