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