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