13dec9fcdSqs /*
23dec9fcdSqs  * CDDL HEADER START
33dec9fcdSqs  *
43dec9fcdSqs  * The contents of this file are subject to the terms of the
53dec9fcdSqs  * Common Development and Distribution License (the "License").
63dec9fcdSqs  * You may not use this file except in compliance with the License.
73dec9fcdSqs  *
83dec9fcdSqs  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93dec9fcdSqs  * or http://www.opensolaris.org/os/licensing.
103dec9fcdSqs  * See the License for the specific language governing permissions
113dec9fcdSqs  * and limitations under the License.
123dec9fcdSqs  *
133dec9fcdSqs  * When distributing Covered Code, include this CDDL HEADER in each
143dec9fcdSqs  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153dec9fcdSqs  * If applicable, add the following below this CDDL HEADER, with the
163dec9fcdSqs  * fields enclosed by brackets "[]" replaced with your own identifying
173dec9fcdSqs  * information: Portions Copyright [yyyy] [name of copyright owner]
183dec9fcdSqs  *
193dec9fcdSqs  * CDDL HEADER END
203dec9fcdSqs  */
213dec9fcdSqs 
223dec9fcdSqs /*
233dec9fcdSqs  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
243dec9fcdSqs  * Use is subject to license terms.
253dec9fcdSqs  */
263dec9fcdSqs 
273dec9fcdSqs #ifndef	_SYS_HXGE_HXGE_TXDMA_HW_H
283dec9fcdSqs #define	_SYS_HXGE_HXGE_TXDMA_HW_H
293dec9fcdSqs 
303dec9fcdSqs #ifdef	__cplusplus
313dec9fcdSqs extern "C" {
323dec9fcdSqs #endif
333dec9fcdSqs 
343dec9fcdSqs #include <hxge_defs.h>
353dec9fcdSqs #include <hxge_tdc_hw.h>
363dec9fcdSqs 
373dec9fcdSqs /*
383dec9fcdSqs  * Transmit Packet Descriptor Structure
393dec9fcdSqs  * 	See Hydra PRM (Chapter 8, Section 8.1.1)
403dec9fcdSqs  */
413dec9fcdSqs typedef union _tx_desc_t {
423dec9fcdSqs 	uint64_t value;
433dec9fcdSqs 	struct {
443dec9fcdSqs #if defined(_BIG_ENDIAN)
45*fe930412Sqs 		uint32_t	sop:1;
46*fe930412Sqs 		uint32_t	mark:1;
47*fe930412Sqs 		uint32_t	num_ptr:4;
48*fe930412Sqs 		uint32_t	rsvd:1;
49*fe930412Sqs 		uint32_t	tr_len:13;
50*fe930412Sqs 		uint32_t	sad:12;
51*fe930412Sqs 		uint32_t	sad_l:32;
523dec9fcdSqs #else
53*fe930412Sqs 		uint32_t	sad_l:32;
54*fe930412Sqs 		uint32_t	sad:12;
55*fe930412Sqs 		uint32_t	tr_len:13;
56*fe930412Sqs 		uint32_t	rsvd:1;
57*fe930412Sqs 		uint32_t	num_ptr:4;
58*fe930412Sqs 		uint32_t	mark:1;
59*fe930412Sqs 		uint32_t	sop:1;
603dec9fcdSqs #endif
613dec9fcdSqs 	} bits;
623dec9fcdSqs } tx_desc_t, *p_tx_desc_t;
633dec9fcdSqs 
643dec9fcdSqs /*
653dec9fcdSqs  * TDC Ring Configuration
663dec9fcdSqs  */
673dec9fcdSqs #define	TDC_TDR_CFG_STADDR_SHIFT	6	/* bits 18:6 */
683dec9fcdSqs #define	TDC_TDR_CFG_STADDR_MASK		0x000000000007FFC0ULL
693dec9fcdSqs #define	TDC_TDR_CFG_ADDR_MASK		0x00000FFFFFFFFFC0ULL
703dec9fcdSqs #define	TDC_TDR_CFG_STADDR_BASE_SHIFT	19	/* bits 43:19 */
713dec9fcdSqs #define	TDC_TDR_CFG_STADDR_BASE_MASK	0x00000FFFFFF80000ULL
723dec9fcdSqs #define	TDC_TDR_CFG_LEN_SHIFT		53	/* bits 63:53 */
733dec9fcdSqs #define	TDC_TDR_CFG_LEN_MASK		0xFFE0000000000000ULL
743dec9fcdSqs #define	TDC_TDR_RST_SHIFT		46
753dec9fcdSqs #define	TDC_TDR_RST_MASK		0x0000400000000000ULL
763dec9fcdSqs 
773dec9fcdSqs /*
783dec9fcdSqs  * Transmit Event Mask
793dec9fcdSqs  */
803dec9fcdSqs #define	TDC_INT_MASK_MK_MASK		0x0000000000008000ULL
813dec9fcdSqs 
823dec9fcdSqs /*
833dec9fcdSqs  * Trasnmit Mailbox High
843dec9fcdSqs  */
853dec9fcdSqs #define	TDC_MBH_SHIFT			0	/* bit 11:0 */
863dec9fcdSqs #define	TDC_MBH_ADDR_SHIFT		32	/* bit 43:32 */
873dec9fcdSqs #define	TDC_MBH_MASK			0x0000000000000FFFULL
883dec9fcdSqs 
893dec9fcdSqs /*
903dec9fcdSqs  * Trasnmit Mailbox Low
913dec9fcdSqs  */
923dec9fcdSqs #define	TDC_MBL_SHIFT			6	/* bit 31:6 */
933dec9fcdSqs #define	TDC_MBL_MASK			0x00000000FFFFFFC0ULL
943dec9fcdSqs 
953dec9fcdSqs #define	TXDMA_MAILBOX_BYTE_LENGTH	64
963dec9fcdSqs #define	TXDMA_MAILBOX_UNUSED		24
973dec9fcdSqs 
983dec9fcdSqs typedef struct _txdma_mailbox_t {
993dec9fcdSqs 	tdc_stat_t		tx_cs;			/* 8 bytes */
1003dec9fcdSqs 	tdc_tdr_pre_head_t	tx_dma_pre_st;		/* 8 bytes */
1013dec9fcdSqs 	tdc_tdr_head_t		tx_ring_hdl;		/* 8 bytes */
1023dec9fcdSqs 	tdc_tdr_kick_t		tx_ring_kick;		/* 8 bytes */
1033dec9fcdSqs 	uint32_t		tx_rng_err_logh;	/* 4 bytes */
1043dec9fcdSqs 	uint32_t		tx_rng_err_logl;	/* 4 bytes */
1053dec9fcdSqs 	uint8_t			resv[TXDMA_MAILBOX_UNUSED];
1063dec9fcdSqs } txdma_mailbox_t, *p_txdma_mailbox_t;
1073dec9fcdSqs 
1083dec9fcdSqs /*
1093dec9fcdSqs  * Internal Transmit Packet Format (16 bytes)
1103dec9fcdSqs  */
1113dec9fcdSqs #define	TX_PKT_HEADER_SIZE			16
1123dec9fcdSqs #define	TX_MAX_GATHER_POINTERS			15
1133dec9fcdSqs #define	TX_GATHER_POINTERS_THRESHOLD		8
1143dec9fcdSqs /*
1153dec9fcdSqs  * There is bugs in the hardware
1163dec9fcdSqs  * and max sfter len is changed from 4096 to 4076.
1173dec9fcdSqs  *
1183dec9fcdSqs  * Jumbo from 9500 to 9216
1193dec9fcdSqs  */
1203dec9fcdSqs #define	TX_MAX_TRANSFER_LENGTH			4076
1213dec9fcdSqs #define	TX_JUMBO_MTU				9216
1223dec9fcdSqs 
1233dec9fcdSqs #define	TX_PKT_HEADER_PAD_SHIFT			0	/* bit 2:0 */
1243dec9fcdSqs #define	TX_PKT_HEADER_PAD_MASK			0x0000000000000007ULL
1253dec9fcdSqs #define	TX_PKT_HEADER_TOT_XFER_LEN_SHIFT	16	/* bit 16:29 */
1263dec9fcdSqs #define	TX_PKT_HEADER_TOT_XFER_LEN_MASK		0x000000000000FFF8ULL
1273dec9fcdSqs #define	TX_PKT_HEADER_L4STUFF_SHIFT		32	/* bit 37:32 */
1283dec9fcdSqs #define	TX_PKT_HEADER_L4STUFF_MASK		0x0000003F00000000ULL
1293dec9fcdSqs #define	TX_PKT_HEADER_L4START_SHIFT		40	/* bit 45:40 */
1303dec9fcdSqs #define	TX_PKT_HEADER_L4START_MASK		0x00003F0000000000ULL
1313dec9fcdSqs #define	TX_PKT_HEADER_L3START_SHIFT		48	/* bit 45:40 */
1323dec9fcdSqs #define	TX_PKT_HEADER_IHL_SHIFT			52	/* bit 52 */
1333dec9fcdSqs #define	TX_PKT_HEADER_VLAN__SHIFT		56	/* bit 56 */
1343dec9fcdSqs #define	TX_PKT_HEADER_TCP_UDP_CRC32C_SHIFT	57	/* bit 57 */
1353dec9fcdSqs #define	TX_PKT_HEADER_LLC_SHIFT			57	/* bit 57 */
1363dec9fcdSqs #define	TX_PKT_HEADER_TCP_UDP_CRC32C_SET	0x0200000000000000ULL
1373dec9fcdSqs #define	TX_PKT_HEADER_TCP_UDP_CRC32C_MASK	0x0200000000000000ULL
1383dec9fcdSqs #define	TX_PKT_HEADER_L4_PROTO_OP_SHIFT		2	/* bit 59:58 */
1393dec9fcdSqs #define	TX_PKT_HEADER_L4_PROTO_OP_MASK		0x0C00000000000000ULL
1403dec9fcdSqs #define	TX_PKT_HEADER_V4_HDR_CS_SHIFT		60	/* bit 60 */
1413dec9fcdSqs #define	TX_PKT_HEADER_V4_HDR_CS_SET		0x1000000000000000ULL
1423dec9fcdSqs #define	TX_PKT_HEADER_V4_HDR_CS_MASK		0x1000000000000000ULL
1433dec9fcdSqs #define	TX_PKT_HEADER_IP_VER_SHIFT		61	/* bit 61 */
1443dec9fcdSqs #define	TX_PKT_HEADER_IP_VER_MASK		0x2000000000000000ULL
1453dec9fcdSqs #define	TX_PKT_HEADER_PKT_TYPE_SHIFT		62	/* bit 62 */
1463dec9fcdSqs #define	TX_PKT_HEADER_PKT_TYPE_MASK		0x4000000000000000ULL
1473dec9fcdSqs 
1483dec9fcdSqs /* L4 Prototol Operations */
1493dec9fcdSqs #define	TX_PKT_L4_PROTO_OP_NOP			0x00
1503dec9fcdSqs #define	TX_PKT_L4_PROTO_OP_FULL_L4_CSUM		0x01
1513dec9fcdSqs #define	TX_PKT_L4_PROTO_OP_L4_PAYLOAD_CSUM	0x02
1523dec9fcdSqs #define	TX_PKT_L4_PROTO_OP_SCTP_CRC32		0x04
1533dec9fcdSqs 
1543dec9fcdSqs /* Transmit Packet Types */
1553dec9fcdSqs #define	TX_PKT_PKT_TYPE_NOP			0x00
1563dec9fcdSqs #define	TX_PKT_PKT_TYPE_TCP			0x01
1573dec9fcdSqs #define	TX_PKT_PKT_TYPE_UDP			0x02
1583dec9fcdSqs #define	TX_PKT_PKT_TYPE_SCTP			0x03
1593dec9fcdSqs 
1603dec9fcdSqs typedef union _tx_pkt_header_t {
1613dec9fcdSqs 	uint64_t value;
1623dec9fcdSqs 	struct {
1633dec9fcdSqs #if defined(_BIG_ENDIAN)
164*fe930412Sqs 		uint32_t	cksum_en_pkt_type:2;
165*fe930412Sqs 		uint32_t	ip_ver:1;
166*fe930412Sqs 		uint32_t	rsrvd:4;
167*fe930412Sqs 		uint32_t	vlan:1;
168*fe930412Sqs 		uint32_t	ihl:4;
169*fe930412Sqs 		uint32_t	l3start:4;
170*fe930412Sqs 		uint32_t	rsvrvd1:2;
171*fe930412Sqs 		uint32_t	l4start:6;
172*fe930412Sqs 		uint32_t	rsvrvd2:2;
173*fe930412Sqs 		uint32_t	l4stuff:6;
174*fe930412Sqs 		uint32_t	rsvrvd3:2;
175*fe930412Sqs 		uint32_t	tot_xfer_len:14;
176*fe930412Sqs 		uint32_t	rsrrvd4:13;
177*fe930412Sqs 		uint32_t	pad:3;
1783dec9fcdSqs #else
179*fe930412Sqs 		uint32_t	pad:3;
180*fe930412Sqs 		uint32_t	rsrrvd4:13;
181*fe930412Sqs 		uint32_t	tot_xfer_len:14;
182*fe930412Sqs 		uint32_t	rsvrvd3:2;
183*fe930412Sqs 		uint32_t	l4stuff:6;
184*fe930412Sqs 		uint32_t	rsvrvd2:2;
185*fe930412Sqs 		uint32_t	l4start:6;
186*fe930412Sqs 		uint32_t	rsvrvd1:2;
187*fe930412Sqs 		uint32_t	l3start:4;
188*fe930412Sqs 		uint32_t	ihl:4;
189*fe930412Sqs 		uint32_t	vlan:1;
190*fe930412Sqs 		uint32_t	rsrvd:4;
191*fe930412Sqs 		uint32_t	ip_ver:1;
192*fe930412Sqs 		uint32_t	cksum_en_pkt_type:2;
1933dec9fcdSqs #endif
1943dec9fcdSqs 	} bits;
1953dec9fcdSqs } tx_pkt_header_t, *p_tx_pkt_header_t;
1963dec9fcdSqs 
1973dec9fcdSqs typedef struct _tx_pkt_hdr_all_t {
1983dec9fcdSqs 	tx_pkt_header_t		pkthdr;
1993dec9fcdSqs 	uint64_t		reserved;
2003dec9fcdSqs } tx_pkt_hdr_all_t, *p_tx_pkt_hdr_all_t;
2013dec9fcdSqs 
2023dec9fcdSqs 
2033dec9fcdSqs #ifdef	__cplusplus
2043dec9fcdSqs }
2053dec9fcdSqs #endif
2063dec9fcdSqs 
2073dec9fcdSqs #endif /* _SYS_HXGE_HXGE_TXDMA_HW_H */
208