xref: /onnv-gate/usr/src/uts/common/io/ntxn/nxhal_nic_interface.h (revision 8687:5dca9cd6354a)
17956Sxiuyan.wang@Sun.COM /*
27956Sxiuyan.wang@Sun.COM  * CDDL HEADER START
37956Sxiuyan.wang@Sun.COM  *
47956Sxiuyan.wang@Sun.COM  * The contents of this file are subject to the terms of the
57956Sxiuyan.wang@Sun.COM  * Common Development and Distribution License (the "License").
67956Sxiuyan.wang@Sun.COM  * You may not use this file except in compliance with the License.
77956Sxiuyan.wang@Sun.COM  *
87956Sxiuyan.wang@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97956Sxiuyan.wang@Sun.COM  * or http://www.opensolaris.org/os/licensing.
107956Sxiuyan.wang@Sun.COM  * See the License for the specific language governing permissions
117956Sxiuyan.wang@Sun.COM  * and limitations under the License.
127956Sxiuyan.wang@Sun.COM  *
137956Sxiuyan.wang@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
147956Sxiuyan.wang@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157956Sxiuyan.wang@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
167956Sxiuyan.wang@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
177956Sxiuyan.wang@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
187956Sxiuyan.wang@Sun.COM  *
197956Sxiuyan.wang@Sun.COM  * CDDL HEADER END
207956Sxiuyan.wang@Sun.COM  */
21*8687SJing.Xiong@Sun.COM 
227956Sxiuyan.wang@Sun.COM /*
237956Sxiuyan.wang@Sun.COM  * Copyright 2008 NetXen, Inc.  All rights reserved.
247956Sxiuyan.wang@Sun.COM  * Use is subject to license terms.
257956Sxiuyan.wang@Sun.COM  */
267956Sxiuyan.wang@Sun.COM /*
277956Sxiuyan.wang@Sun.COM  * Data types and structure for HAL - NIC interface.
287956Sxiuyan.wang@Sun.COM  *
297956Sxiuyan.wang@Sun.COM  */
307956Sxiuyan.wang@Sun.COM 
317956Sxiuyan.wang@Sun.COM #ifndef _NXHAL_NIC_INTERFACE_H_
327956Sxiuyan.wang@Sun.COM #define	_NXHAL_NIC_INTERFACE_H_
337956Sxiuyan.wang@Sun.COM 
34*8687SJing.Xiong@Sun.COM #ifdef __cplusplus
35*8687SJing.Xiong@Sun.COM extern "C" {
36*8687SJing.Xiong@Sun.COM #endif
37*8687SJing.Xiong@Sun.COM 
387956Sxiuyan.wang@Sun.COM /*
397956Sxiuyan.wang@Sun.COM  *        Simple Types
407956Sxiuyan.wang@Sun.COM  */
417956Sxiuyan.wang@Sun.COM 
427956Sxiuyan.wang@Sun.COM typedef	U32	nx_reg_addr_t;
437956Sxiuyan.wang@Sun.COM 
447956Sxiuyan.wang@Sun.COM /*
457956Sxiuyan.wang@Sun.COM  *        Root crb-based firmware commands
467956Sxiuyan.wang@Sun.COM  */
477956Sxiuyan.wang@Sun.COM 
487956Sxiuyan.wang@Sun.COM /*
497956Sxiuyan.wang@Sun.COM  * CRB Root Command
507956Sxiuyan.wang@Sun.COM  * A single set of crbs is used across all physical/virtual
517956Sxiuyan.wang@Sun.COM  * functions for capability queries, initialization, and
527956Sxiuyan.wang@Sun.COM  * context creation/destruction.
537956Sxiuyan.wang@Sun.COM  *
547956Sxiuyan.wang@Sun.COM  * There are 4 CRBS:
557956Sxiuyan.wang@Sun.COM  *					Command/Response CRB
567956Sxiuyan.wang@Sun.COM  *					Argument1 CRB
577956Sxiuyan.wang@Sun.COM  *					Argument2 CRB
587956Sxiuyan.wang@Sun.COM  *					Argument3 CRB
597956Sxiuyan.wang@Sun.COM  *					Signature CRB
607956Sxiuyan.wang@Sun.COM  *
617956Sxiuyan.wang@Sun.COM  * The cmd/rsp crb is always intiated by the host via
627956Sxiuyan.wang@Sun.COM  * a command code and always responded by the card with
637956Sxiuyan.wang@Sun.COM  * a response code. The cmd and rsp codes are disjoint.
647956Sxiuyan.wang@Sun.COM  * The sequence of use is always CMD, RSP, CLEAR CMD.
657956Sxiuyan.wang@Sun.COM  *
667956Sxiuyan.wang@Sun.COM  * The arguments are for passing in command specific
677956Sxiuyan.wang@Sun.COM  * and response specific parameters/data.
687956Sxiuyan.wang@Sun.COM  *
697956Sxiuyan.wang@Sun.COM  * The signature is composed of a magic value, the
707956Sxiuyan.wang@Sun.COM  * pci function id, and a command sequence id:
717956Sxiuyan.wang@Sun.COM  *		[7:0]  = pci function
727956Sxiuyan.wang@Sun.COM  *		[15:8]  = version
737956Sxiuyan.wang@Sun.COM  *		[31:16] = magic of 0xcafe
747956Sxiuyan.wang@Sun.COM  *
757956Sxiuyan.wang@Sun.COM  *	The pci function allows the card to take correct
767956Sxiuyan.wang@Sun.COM  *	action for the given particular commands.
777956Sxiuyan.wang@Sun.COM  *	The firmware will attempt to detect
787956Sxiuyan.wang@Sun.COM  *	an errant driver that has died while holding
797956Sxiuyan.wang@Sun.COM  *	the root crb hardware lock. Such an error condition
807956Sxiuyan.wang@Sun.COM  *	shows up as the cmd/rsp crb stuck in a non-clear state.
817956Sxiuyan.wang@Sun.COM  *
827956Sxiuyan.wang@Sun.COM  * Interface Sequence:
837956Sxiuyan.wang@Sun.COM  *	 Host always makes requests and firmware always responds.
847956Sxiuyan.wang@Sun.COM  *	 Note that data field is always set prior to command field.
857956Sxiuyan.wang@Sun.COM  *
867956Sxiuyan.wang@Sun.COM  *		[READ]             CMD/RSP CRB      ARGUMENT FIELD
877956Sxiuyan.wang@Sun.COM  *		Host grab lock
887956Sxiuyan.wang@Sun.COM  *		Host  ->           CMD              optional parameter
897956Sxiuyan.wang@Sun.COM  *		FW   <-  (Good)    RSP-OK           DATA
907956Sxiuyan.wang@Sun.COM  *		FW   <-  (Fail)    RSP-FAIL         optional failure code
917956Sxiuyan.wang@Sun.COM  *		Host ->            CLEAR
927956Sxiuyan.wang@Sun.COM  *		Host release lock
937956Sxiuyan.wang@Sun.COM  *
947956Sxiuyan.wang@Sun.COM  * [WRITE]            CMD/RSP CRB      ARGUMENT FIELD
957956Sxiuyan.wang@Sun.COM  * Host grab lock
967956Sxiuyan.wang@Sun.COM  * Host  ->           CMD              DATA
977956Sxiuyan.wang@Sun.COM  * FW   <-  (Good)    RSP-OK           optional write status
987956Sxiuyan.wang@Sun.COM  * FW   <-  (Write)   RSP-FAIL         optional failure code
997956Sxiuyan.wang@Sun.COM  * Host ->            CLEAR
1007956Sxiuyan.wang@Sun.COM  * Host release lock
1017956Sxiuyan.wang@Sun.COM  */
1027956Sxiuyan.wang@Sun.COM 
1037956Sxiuyan.wang@Sun.COM 
1047956Sxiuyan.wang@Sun.COM /*
1057956Sxiuyan.wang@Sun.COM  *        CMD/RSP
1067956Sxiuyan.wang@Sun.COM  */
1077956Sxiuyan.wang@Sun.COM 
1087956Sxiuyan.wang@Sun.COM #define	NX_CDRP_SIGNATURE_TO_PCIFN(sign)    ((sign) & 0xff)
1097956Sxiuyan.wang@Sun.COM #define	NX_CDRP_SIGNATURE_TO_VERSION(sign)  (((sign)>>8) & 0xff)
1107956Sxiuyan.wang@Sun.COM #define	NX_CDRP_SIGNATURE_TO_MAGIC(sign)    (((sign)>>16) & 0xffff)
1117956Sxiuyan.wang@Sun.COM #define	NX_CDRP_SIGNATURE_VALID(sign)       \
1127956Sxiuyan.wang@Sun.COM 	(NX_CDRP_SIGNATURE_TO_MAGIC(sign) == 0xcafe && \
1137956Sxiuyan.wang@Sun.COM 	    NX_CDRP_SIGNATURE_TO_PCIFN(sign) < 8)
1147956Sxiuyan.wang@Sun.COM #define	NX_CDRP_SIGNATURE_MAKE(pcifn, version) \
1157956Sxiuyan.wang@Sun.COM 	(((pcifn) & 0xff) |		      \
1167956Sxiuyan.wang@Sun.COM 	    (((version) & 0xff) << 8) |	      \
1177956Sxiuyan.wang@Sun.COM 	    ((u32)0xcafe << 16))
1187956Sxiuyan.wang@Sun.COM 
1197956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CLEAR			0x00000000
1207956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_BIT			0x80000000
1217956Sxiuyan.wang@Sun.COM 
1227956Sxiuyan.wang@Sun.COM /*
1237956Sxiuyan.wang@Sun.COM  * All responses must have the NX_CDRP_CMD_BIT cleared
1247956Sxiuyan.wang@Sun.COM  * in the crb NX_CDRP_CRB_OFFSET.
1257956Sxiuyan.wang@Sun.COM  */
1267956Sxiuyan.wang@Sun.COM 
1277956Sxiuyan.wang@Sun.COM #define	NX_CDRP_FORM_RSP(rsp)		(rsp)
1287956Sxiuyan.wang@Sun.COM #define	NX_CDRP_IS_RSP(rsp)			(((rsp) & NX_CDRP_CMD_BIT) == 0)
1297956Sxiuyan.wang@Sun.COM 
1307956Sxiuyan.wang@Sun.COM #define	NX_CDRP_RSP_OK				0x00000001
1317956Sxiuyan.wang@Sun.COM #define	NX_CDRP_RSP_FAIL			0x00000002
1327956Sxiuyan.wang@Sun.COM #define	NX_CDRP_RSP_TIMEOUT			0x00000003
1337956Sxiuyan.wang@Sun.COM 
1347956Sxiuyan.wang@Sun.COM /*
1357956Sxiuyan.wang@Sun.COM  * All commands must have the NX_CDRP_CMD_BIT set in
1367956Sxiuyan.wang@Sun.COM  * the crb NX_CDRP_CRB_OFFSET.
1377956Sxiuyan.wang@Sun.COM  * The macros below do not have it explicitly set to
1387956Sxiuyan.wang@Sun.COM  * allow their use in lookup tables
1397956Sxiuyan.wang@Sun.COM  */
1407956Sxiuyan.wang@Sun.COM #define	NX_CDRP_FORM_CMD(cmd)	(NX_CDRP_CMD_BIT | (cmd))
1417956Sxiuyan.wang@Sun.COM #define	NX_CDRP_IS_CMD(cmd)		(((cmd) & NX_CDRP_CMD_BIT) != 0)
1427956Sxiuyan.wang@Sun.COM 
1437956Sxiuyan.wang@Sun.COM /* [CMD] Capability Vector [RSP] Capability Vector */
1447956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_SUBMIT_CAPABILITIES		0x00000001
1457956Sxiuyan.wang@Sun.COM 
1467956Sxiuyan.wang@Sun.COM /* [CMD] - [RSP] Query Value */
1477956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_READ_MAX_RDS_PER_CTX    0x00000002
1487956Sxiuyan.wang@Sun.COM 
1497956Sxiuyan.wang@Sun.COM /* [CMD] - [RSP] Query Value */
1507956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_READ_MAX_SDS_PER_CTX    0x00000003
1517956Sxiuyan.wang@Sun.COM 
1527956Sxiuyan.wang@Sun.COM /* [CMD] - [RSP] Query Value */
1537956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_READ_MAX_RULES_PER_CTX  0x00000004
1547956Sxiuyan.wang@Sun.COM 
1557956Sxiuyan.wang@Sun.COM /* [CMD] - [RSP] Query Value */
1567956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_READ_MAX_RX_CTX			0x00000005
1577956Sxiuyan.wang@Sun.COM 
1587956Sxiuyan.wang@Sun.COM /* [CMD] - [RSP] Query Value */
1597956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_READ_MAX_TX_CTX			0x00000006
1607956Sxiuyan.wang@Sun.COM 
1617956Sxiuyan.wang@Sun.COM /* [CMD] Rx Config DMA Addr [RSP] rcode */
1627956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_CREATE_RX_CTX			0x00000007
1637956Sxiuyan.wang@Sun.COM 
1647956Sxiuyan.wang@Sun.COM /* [CMD] Rx Context Handle, Reset Kind [RSP] rcode */
1657956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_DESTROY_RX_CTX			0x00000008
1667956Sxiuyan.wang@Sun.COM 
1677956Sxiuyan.wang@Sun.COM /* [CMD] Tx Config DMA Addr [RSP] rcode */
1687956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_CREATE_TX_CTX			0x00000009
1697956Sxiuyan.wang@Sun.COM 
1707956Sxiuyan.wang@Sun.COM /* [CMD] Tx Context Handle, Reset Kind [RSP] rcode */
1717956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_DESTROY_TX_CTX			0x0000000a
1727956Sxiuyan.wang@Sun.COM 
1737956Sxiuyan.wang@Sun.COM /* [CMD] Stat setup dma addr - [RSP] Handle, rcode */
1747956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_SETUP_STATISTICS		0x0000000e
1757956Sxiuyan.wang@Sun.COM 
1767956Sxiuyan.wang@Sun.COM /* [CMD] Handle - [RSP] rcode */
1777956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_GET_STATISTICS			0x0000000f
1787956Sxiuyan.wang@Sun.COM 
1797956Sxiuyan.wang@Sun.COM /* [CMD] Handle - [RSP] rcode */
1807956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_DELETE_STATISTICS		0x00000010
1817956Sxiuyan.wang@Sun.COM 
1827956Sxiuyan.wang@Sun.COM /* [CMD] - [RSP] rcode */
1837956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_GEN_INT					0x00000011
1847956Sxiuyan.wang@Sun.COM 
1857956Sxiuyan.wang@Sun.COM /* [CMD] MTU - [RSP] rcode */
1867956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_SET_MTU					0x00000012
1877956Sxiuyan.wang@Sun.COM 
1887956Sxiuyan.wang@Sun.COM #define	NX_CDRP_CMD_MAX						0x00000013
1897956Sxiuyan.wang@Sun.COM 
1907956Sxiuyan.wang@Sun.COM /*
1917956Sxiuyan.wang@Sun.COM  *        Capabilities
1927956Sxiuyan.wang@Sun.COM  */
1937956Sxiuyan.wang@Sun.COM 
1947956Sxiuyan.wang@Sun.COM #define	NX_CAP_BIT(class, bit)				(1 << bit)
1957956Sxiuyan.wang@Sun.COM 
1967956Sxiuyan.wang@Sun.COM /* Class 0 (i.e. ARGS 1) */
1977956Sxiuyan.wang@Sun.COM #define	NX_CAP0_LEGACY_CONTEXT			NX_CAP_BIT(0, 0)
1987956Sxiuyan.wang@Sun.COM #define	NX_CAP0_MULTI_CONTEXT			NX_CAP_BIT(0, 1)
1997956Sxiuyan.wang@Sun.COM #define	NX_CAP0_LEGACY_MN				NX_CAP_BIT(0, 2)
2007956Sxiuyan.wang@Sun.COM #define	NX_CAP0_LEGACY_MS				NX_CAP_BIT(0, 3)
2017956Sxiuyan.wang@Sun.COM #define	NX_CAP0_CUT_THROUGH				NX_CAP_BIT(0, 4)
2027956Sxiuyan.wang@Sun.COM #define	NX_CAP0_LRO						NX_CAP_BIT(0, 5)
2037956Sxiuyan.wang@Sun.COM #define	NX_CAP0_LSO						NX_CAP_BIT(0, 6)
2047956Sxiuyan.wang@Sun.COM #define	NX_CAP0_JUMBO_CONTIGUOUS		NX_CAP_BIT(0, 7)
2057956Sxiuyan.wang@Sun.COM #define	NX_CAP0_LRO_CONTIGUOUS		    NX_CAP_BIT(0, 8)
2067956Sxiuyan.wang@Sun.COM 
2077956Sxiuyan.wang@Sun.COM /* Class 1 (i.e. ARGS 2) */
2087956Sxiuyan.wang@Sun.COM #define	NX_CAP1_NIC						NX_CAP_BIT(1, 0)
2097956Sxiuyan.wang@Sun.COM #define	NX_CAP1_PXE						NX_CAP_BIT(1, 1)
2107956Sxiuyan.wang@Sun.COM #define	NX_CAP1_CHIMNEY					NX_CAP_BIT(1, 2)
2117956Sxiuyan.wang@Sun.COM #define	NX_CAP1_LSA						NX_CAP_BIT(1, 3)
2127956Sxiuyan.wang@Sun.COM #define	NX_CAP1_RDMA					NX_CAP_BIT(1, 4)
2137956Sxiuyan.wang@Sun.COM #define	NX_CAP1_ISCSI					NX_CAP_BIT(1, 5)
2147956Sxiuyan.wang@Sun.COM #define	NX_CAP1_FCOE					NX_CAP_BIT(1, 6)
2157956Sxiuyan.wang@Sun.COM 
2167956Sxiuyan.wang@Sun.COM /* Class 2 (i.e. ARGS 3) */
2177956Sxiuyan.wang@Sun.COM 
2187956Sxiuyan.wang@Sun.COM /*
2197956Sxiuyan.wang@Sun.COM  *        Rules
2207956Sxiuyan.wang@Sun.COM  */
2217956Sxiuyan.wang@Sun.COM 
2227956Sxiuyan.wang@Sun.COM typedef	U32	nx_rx_rule_type_t;
2237956Sxiuyan.wang@Sun.COM 
2247956Sxiuyan.wang@Sun.COM #define	NX_RX_RULETYPE_DEFAULT				0
2257956Sxiuyan.wang@Sun.COM #define	NX_RX_RULETYPE_MAC					1
2267956Sxiuyan.wang@Sun.COM #define	NX_RX_RULETYPE_MAC_VLAN				2
2277956Sxiuyan.wang@Sun.COM #define	NX_RX_RULETYPE_MAC_RSS				3
2287956Sxiuyan.wang@Sun.COM #define	NX_RX_RULETYPE_MAC_VLAN_RSS			4
2297956Sxiuyan.wang@Sun.COM #define	NX_RX_RULETYPE_MAX					5
2307956Sxiuyan.wang@Sun.COM 
2317956Sxiuyan.wang@Sun.COM typedef	U32	nx_rx_rule_cmd_t;
2327956Sxiuyan.wang@Sun.COM 
2337956Sxiuyan.wang@Sun.COM #define	NX_RX_RULECMD_ADD					0
2347956Sxiuyan.wang@Sun.COM #define	NX_RX_RULECMD_REMOVE				1
2357956Sxiuyan.wang@Sun.COM #define	NX_RX_RULECMD_MAX					2
2367956Sxiuyan.wang@Sun.COM 
2377956Sxiuyan.wang@Sun.COM typedef struct nx_rx_rule_arg_s {
2387956Sxiuyan.wang@Sun.COM 	union {
2397956Sxiuyan.wang@Sun.COM 		struct {
2407956Sxiuyan.wang@Sun.COM 			char mac[6];
2417956Sxiuyan.wang@Sun.COM 		} m;
2427956Sxiuyan.wang@Sun.COM 		struct {
2437956Sxiuyan.wang@Sun.COM 			char mac[6];
2447956Sxiuyan.wang@Sun.COM 			char vlan;
2457956Sxiuyan.wang@Sun.COM 		} mv;
2467956Sxiuyan.wang@Sun.COM 		struct {
2477956Sxiuyan.wang@Sun.COM 			char mac[6];
2487956Sxiuyan.wang@Sun.COM 		} mr;
2497956Sxiuyan.wang@Sun.COM 		struct {
2507956Sxiuyan.wang@Sun.COM 			char mac[6];
2517956Sxiuyan.wang@Sun.COM 			char vlan;
2527956Sxiuyan.wang@Sun.COM 		} mvr;
2537956Sxiuyan.wang@Sun.COM 	} s1;
2547956Sxiuyan.wang@Sun.COM 	/* will be union of all the different args for rules */
2557956Sxiuyan.wang@Sun.COM 	U64 data;
2567956Sxiuyan.wang@Sun.COM } nx_rx_rule_arg_t;
2577956Sxiuyan.wang@Sun.COM 
2587956Sxiuyan.wang@Sun.COM typedef struct nx_rx_rule_s {
2597956Sxiuyan.wang@Sun.COM 	U32 id;
2607956Sxiuyan.wang@Sun.COM 	U32 active;
2617956Sxiuyan.wang@Sun.COM 	nx_rx_rule_arg_t arg;
2627956Sxiuyan.wang@Sun.COM 	nx_rx_rule_type_t type;
2637956Sxiuyan.wang@Sun.COM } nx_rx_rule_t;
2647956Sxiuyan.wang@Sun.COM 
2657956Sxiuyan.wang@Sun.COM /* MSG - REQUIRES TX CONTEXT */
2667956Sxiuyan.wang@Sun.COM 
2677956Sxiuyan.wang@Sun.COM /*
2687956Sxiuyan.wang@Sun.COM  * The rules can be added/deleted from both the
2697956Sxiuyan.wang@Sun.COM  *  host and card sides so rq/rsp are similar.
2707956Sxiuyan.wang@Sun.COM  */
2717956Sxiuyan.wang@Sun.COM typedef struct nx_hostmsg_rx_rule_s {
2727956Sxiuyan.wang@Sun.COM 	nx_rx_rule_cmd_t cmd;
2737956Sxiuyan.wang@Sun.COM 	nx_rx_rule_t rule;
2747956Sxiuyan.wang@Sun.COM } nx_hostmsg_rx_rule_t;
2757956Sxiuyan.wang@Sun.COM 
2767956Sxiuyan.wang@Sun.COM typedef struct nx_cardmsg_rx_rule_s {
2777956Sxiuyan.wang@Sun.COM 	nx_rcode_t rcode;
2787956Sxiuyan.wang@Sun.COM 	nx_rx_rule_cmd_t cmd;
2797956Sxiuyan.wang@Sun.COM 	nx_rx_rule_t rule;
2807956Sxiuyan.wang@Sun.COM } nx_cardmsg_rx_rule_t;
2817956Sxiuyan.wang@Sun.COM 
2827956Sxiuyan.wang@Sun.COM 
2837956Sxiuyan.wang@Sun.COM /*
2847956Sxiuyan.wang@Sun.COM  *        Common to Rx/Tx contexts
2857956Sxiuyan.wang@Sun.COM  */
2867956Sxiuyan.wang@Sun.COM 
2877956Sxiuyan.wang@Sun.COM /*
2887956Sxiuyan.wang@Sun.COM  * Context states
2897956Sxiuyan.wang@Sun.COM  */
2907956Sxiuyan.wang@Sun.COM 
2917956Sxiuyan.wang@Sun.COM typedef U32 nx_host_ctx_state_t;
2927956Sxiuyan.wang@Sun.COM 
2937956Sxiuyan.wang@Sun.COM #define	NX_HOST_CTX_STATE_FREED		0 /* Invalid state */
2947956Sxiuyan.wang@Sun.COM #define	NX_HOST_CTX_STATE_ALLOCATED	1 /* Not committed */
2957956Sxiuyan.wang@Sun.COM /* The following states imply FW is aware of context */
2967956Sxiuyan.wang@Sun.COM #define	NX_HOST_CTX_STATE_ACTIVE	2
2977956Sxiuyan.wang@Sun.COM #define	NX_HOST_CTX_STATE_DISABLED	3
2987956Sxiuyan.wang@Sun.COM #define	NX_HOST_CTX_STATE_QUIESCED	4
2997956Sxiuyan.wang@Sun.COM #define	NX_HOST_CTX_STATE_MAX		5
3007956Sxiuyan.wang@Sun.COM 
3017956Sxiuyan.wang@Sun.COM /*
3027956Sxiuyan.wang@Sun.COM  * Interrupt mask crb use must be set identically on the Tx
3037956Sxiuyan.wang@Sun.COM  * and Rx context configs across a pci function
3047956Sxiuyan.wang@Sun.COM  */
3057956Sxiuyan.wang@Sun.COM 
3067956Sxiuyan.wang@Sun.COM /* Rx and Tx have unique interrupt/crb */
3077956Sxiuyan.wang@Sun.COM #define	NX_HOST_INT_CRB_MODE_UNIQUE		0
3087956Sxiuyan.wang@Sun.COM /* Rx and Tx share a common interrupt/crb */
3097956Sxiuyan.wang@Sun.COM #define	NX_HOST_INT_CRB_MODE_SHARED		1	/* <= LEGACY */
3107956Sxiuyan.wang@Sun.COM /* Rx does not use a crb */
3117956Sxiuyan.wang@Sun.COM #define	NX_HOST_INT_CRB_MODE_NORX		2
3127956Sxiuyan.wang@Sun.COM /* Tx does not use a crb */
3137956Sxiuyan.wang@Sun.COM #define	NX_HOST_INT_CRB_MODE_NOTX		3
3147956Sxiuyan.wang@Sun.COM /* Neither Rx nor Tx use a crb */
3157956Sxiuyan.wang@Sun.COM #define	NX_HOST_INT_CRB_MODE_NORXTX		4
3167956Sxiuyan.wang@Sun.COM 
3177956Sxiuyan.wang@Sun.COM /*
3187956Sxiuyan.wang@Sun.COM  * Destroy Rx/Tx
3197956Sxiuyan.wang@Sun.COM  */
3207956Sxiuyan.wang@Sun.COM 
3217956Sxiuyan.wang@Sun.COM #define	NX_DESTROY_CTX_RESET			0
3227956Sxiuyan.wang@Sun.COM #define	NX_DESTROY_CTX_D3_RESET			1
3237956Sxiuyan.wang@Sun.COM #define	NX_DESTROY_CTX_MAX				2
3247956Sxiuyan.wang@Sun.COM 
3257956Sxiuyan.wang@Sun.COM 
3267956Sxiuyan.wang@Sun.COM /*
3277956Sxiuyan.wang@Sun.COM  *        Tx
3287956Sxiuyan.wang@Sun.COM  */
3297956Sxiuyan.wang@Sun.COM 
3307956Sxiuyan.wang@Sun.COM /*
3317956Sxiuyan.wang@Sun.COM  * Components of the host-request for Tx context creation.
3327956Sxiuyan.wang@Sun.COM  * CRB - DOES NOT REQUIRE Rx/TX CONTEXT
3337956Sxiuyan.wang@Sun.COM  */
3347956Sxiuyan.wang@Sun.COM 
3357956Sxiuyan.wang@Sun.COM typedef struct nx_hostrq_cds_ring_s {
3367956Sxiuyan.wang@Sun.COM 	U64 host_phys_addr;	/* Ring base addr */
3377956Sxiuyan.wang@Sun.COM 	U32 ring_size;		/* Ring entries */
3387956Sxiuyan.wang@Sun.COM 	U32 rsvd;		/* Padding */
3397956Sxiuyan.wang@Sun.COM } nx_hostrq_cds_ring_t;
3407956Sxiuyan.wang@Sun.COM 
3417956Sxiuyan.wang@Sun.COM typedef struct nx_hostrq_tx_ctx_s {
3427956Sxiuyan.wang@Sun.COM 	U64 host_rsp_dma_addr;	/* Response dma'd here */
3437956Sxiuyan.wang@Sun.COM 	U64 cmd_cons_dma_addr;	/*  */
3447956Sxiuyan.wang@Sun.COM 	U64 dummy_dma_addr;	/*  */
3457956Sxiuyan.wang@Sun.COM 	U32 capabilities[4];	/* Flag bit vector */
3467956Sxiuyan.wang@Sun.COM 	U32 host_int_crb_mode;	/* Interrupt crb usage */
3477956Sxiuyan.wang@Sun.COM 	U32 rsvd1;		/* Padding */
3487956Sxiuyan.wang@Sun.COM 	U16 rsvd2;		/* Padding */
3497956Sxiuyan.wang@Sun.COM 	U16 interrupt_ctl;
3507956Sxiuyan.wang@Sun.COM 	U16 msi_index;
3517956Sxiuyan.wang@Sun.COM 	U16 rsvd3;		/* Padding */
3527956Sxiuyan.wang@Sun.COM 	nx_hostrq_cds_ring_t cds_ring;	/* Desc of cds ring */
3537956Sxiuyan.wang@Sun.COM 	U8  reserved[128];	/* future expansion */
3547956Sxiuyan.wang@Sun.COM } nx_hostrq_tx_ctx_t;
3557956Sxiuyan.wang@Sun.COM 
3567956Sxiuyan.wang@Sun.COM typedef struct nx_cardrsp_cds_ring_s {
3577956Sxiuyan.wang@Sun.COM 	U32 host_producer_crb;	/* Crb to use */
3587956Sxiuyan.wang@Sun.COM 	U32 interrupt_crb;	/* Crb to use */
3597956Sxiuyan.wang@Sun.COM } nx_cardrsp_cds_ring_t;
3607956Sxiuyan.wang@Sun.COM 
3617956Sxiuyan.wang@Sun.COM typedef struct nx_cardrsp_tx_ctx_s {
3627956Sxiuyan.wang@Sun.COM 	U32 host_ctx_state;	/* Starting state */
3637956Sxiuyan.wang@Sun.COM 	U16 context_id;		/* Handle for context */
3647956Sxiuyan.wang@Sun.COM 	U8  phys_port;		/* Physical id of port */
3657956Sxiuyan.wang@Sun.COM 	U8  virt_port;		/* Virtual/Logical id of port */
3667956Sxiuyan.wang@Sun.COM 	nx_cardrsp_cds_ring_t cds_ring;	/* Card cds settings */
3677956Sxiuyan.wang@Sun.COM 	U8  reserved[128];	/* future expansion */
3687956Sxiuyan.wang@Sun.COM } nx_cardrsp_tx_ctx_t;
3697956Sxiuyan.wang@Sun.COM 
3707956Sxiuyan.wang@Sun.COM #define	SIZEOF_HOSTRQ_TX(HOSTRQ_TX) 			\
3717956Sxiuyan.wang@Sun.COM 		(sizeof (HOSTRQ_TX))
3727956Sxiuyan.wang@Sun.COM 
3737956Sxiuyan.wang@Sun.COM #define	SIZEOF_CARDRSP_TX(CARDRSP_TX) 			\
3747956Sxiuyan.wang@Sun.COM 		(sizeof (CARDRSP_TX))
3757956Sxiuyan.wang@Sun.COM 
3767956Sxiuyan.wang@Sun.COM /*
3777956Sxiuyan.wang@Sun.COM  *        Rx
3787956Sxiuyan.wang@Sun.COM  */
3797956Sxiuyan.wang@Sun.COM 
3807956Sxiuyan.wang@Sun.COM /*
3817956Sxiuyan.wang@Sun.COM  * RDS ring mapping to producer crbs
3827956Sxiuyan.wang@Sun.COM  */
3837956Sxiuyan.wang@Sun.COM 
3847956Sxiuyan.wang@Sun.COM /* Each ring has a unique crb */
3857956Sxiuyan.wang@Sun.COM #define	NX_HOST_RDS_CRB_MODE_UNIQUE    0	/* <= LEGACY */
3867956Sxiuyan.wang@Sun.COM 
3877956Sxiuyan.wang@Sun.COM /*
3887956Sxiuyan.wang@Sun.COM  * All configured RDS Rings share common crb:
3897956Sxiuyan.wang@Sun.COM  *		1 Ring  - same as unique
3907956Sxiuyan.wang@Sun.COM  *		2 Rings - 16, 16
3917956Sxiuyan.wang@Sun.COM  *		3 Rings - 10, 10, 10
3927956Sxiuyan.wang@Sun.COM  */
3937956Sxiuyan.wang@Sun.COM #define	NX_HOST_RDS_CRB_MODE_SHARED    1
3947956Sxiuyan.wang@Sun.COM 
3957956Sxiuyan.wang@Sun.COM /*
3967956Sxiuyan.wang@Sun.COM  * Bit usage is specified per-ring using the
3977956Sxiuyan.wang@Sun.COM  * ring's size. Sum of bit lengths must be <= 32.
3987956Sxiuyan.wang@Sun.COM  * Packing is [Ring N] ... [Ring 1][Ring 0]
3997956Sxiuyan.wang@Sun.COM  */
4007956Sxiuyan.wang@Sun.COM #define	NX_HOST_RDS_CRB_MODE_CUSTOM		2
4017956Sxiuyan.wang@Sun.COM #define	NX_HOST_RDS_CRB_MODE_MAX		3
4027956Sxiuyan.wang@Sun.COM 
4037956Sxiuyan.wang@Sun.COM 
4047956Sxiuyan.wang@Sun.COM /*
4057956Sxiuyan.wang@Sun.COM  * RDS Ting Types
4067956Sxiuyan.wang@Sun.COM  */
4077956Sxiuyan.wang@Sun.COM 
4087956Sxiuyan.wang@Sun.COM #define	NX_RDS_RING_TYPE_NORMAL		0
4097956Sxiuyan.wang@Sun.COM #define	NX_RDS_RING_TYPE_JUMBO		1
4107956Sxiuyan.wang@Sun.COM #define	NX_RDS_RING_TYPE_LRO		2
4117956Sxiuyan.wang@Sun.COM #define	NX_RDS_RING_TYPE_MAX		3
4127956Sxiuyan.wang@Sun.COM 
4137956Sxiuyan.wang@Sun.COM /*
4147956Sxiuyan.wang@Sun.COM  * Components of the host-request for Rx context creation.
4157956Sxiuyan.wang@Sun.COM  * CRB - DOES NOT REQUIRE Rx/TX CONTEXT
4167956Sxiuyan.wang@Sun.COM  */
4177956Sxiuyan.wang@Sun.COM 
4187956Sxiuyan.wang@Sun.COM typedef struct nx_hostrq_sds_ring_s {
4197956Sxiuyan.wang@Sun.COM 	U64 host_phys_addr;	/* Ring base addr */
4207956Sxiuyan.wang@Sun.COM 	U32 ring_size;		/* Ring entries */
4217956Sxiuyan.wang@Sun.COM 	U16 msi_index;
4227956Sxiuyan.wang@Sun.COM 	U16 rsvd;		/* Padding */
4237956Sxiuyan.wang@Sun.COM } nx_hostrq_sds_ring_t;
4247956Sxiuyan.wang@Sun.COM 
4257956Sxiuyan.wang@Sun.COM typedef struct nx_hostrq_rds_ring_s {
4267956Sxiuyan.wang@Sun.COM 	U64 host_phys_addr;	/* Ring base addr */
4277956Sxiuyan.wang@Sun.COM 	U64 buff_size;		/* Packet buffer size */
4287956Sxiuyan.wang@Sun.COM 	U32 ring_size;		/* Ring entries */
4297956Sxiuyan.wang@Sun.COM 	U32 ring_kind;		/* Class of ring */
4307956Sxiuyan.wang@Sun.COM } nx_hostrq_rds_ring_t;
4317956Sxiuyan.wang@Sun.COM 
4327956Sxiuyan.wang@Sun.COM typedef struct nx_hostrq_rx_ctx_s {
4337956Sxiuyan.wang@Sun.COM 	U64 host_rsp_dma_addr;	/* Response dma'd here */
4347956Sxiuyan.wang@Sun.COM 	U32 capabilities[4];	/* Flag bit vector */
4357956Sxiuyan.wang@Sun.COM 	U32 host_int_crb_mode;	/* Interrupt crb usage */
4367956Sxiuyan.wang@Sun.COM 	U32 host_rds_crb_mode;	/* RDS crb usage */
437*8687SJing.Xiong@Sun.COM 	/* These ring offsets are relative to end of structure */
4387956Sxiuyan.wang@Sun.COM 	U32 rds_ring_offset;	/* Offset to RDS config */
4397956Sxiuyan.wang@Sun.COM 	U32 sds_ring_offset;	/* Offset to SDS config */
4407956Sxiuyan.wang@Sun.COM 	U16 num_rds_rings;	/* Count of RDS rings */
4417956Sxiuyan.wang@Sun.COM 	U16 num_sds_rings;	/* Count of SDS rings */
4427956Sxiuyan.wang@Sun.COM 	U16 rsvd1;		/* Padding */
4437956Sxiuyan.wang@Sun.COM 	U16 rsvd2;		/* Padding */
4447956Sxiuyan.wang@Sun.COM 	U8  reserved[128]; 	/* reserve space for future expansion */
4457956Sxiuyan.wang@Sun.COM 	/*
4467956Sxiuyan.wang@Sun.COM 	 * MUST BE 64-bit aligned.
4477956Sxiuyan.wang@Sun.COM 	 * The following is packed:
4487956Sxiuyan.wang@Sun.COM 	 * - N hostrq_rds_rings
4497956Sxiuyan.wang@Sun.COM 	 * - N hostrq_sds_rings
4507956Sxiuyan.wang@Sun.COM 	 */
4517956Sxiuyan.wang@Sun.COM } nx_hostrq_rx_ctx_t;
4527956Sxiuyan.wang@Sun.COM 
4537956Sxiuyan.wang@Sun.COM typedef struct nx_cardrsp_rds_ring_s {
4547956Sxiuyan.wang@Sun.COM 	U32 host_producer_crb;	/* Crb to use */
4557956Sxiuyan.wang@Sun.COM 	U32 rsvd1;		/* Padding */
4567956Sxiuyan.wang@Sun.COM } nx_cardrsp_rds_ring_t;
4577956Sxiuyan.wang@Sun.COM 
4587956Sxiuyan.wang@Sun.COM typedef struct nx_cardrsp_sds_ring_s {
4597956Sxiuyan.wang@Sun.COM 	U32 host_consumer_crb;	/* Crb to use */
4607956Sxiuyan.wang@Sun.COM 	U32 interrupt_crb;	/* Crb to use */
4617956Sxiuyan.wang@Sun.COM } nx_cardrsp_sds_ring_t;
4627956Sxiuyan.wang@Sun.COM 
4637956Sxiuyan.wang@Sun.COM typedef struct nx_cardrsp_rx_ctx_s {
464*8687SJing.Xiong@Sun.COM 	/* These ring offsets are relative to end of structure */
4657956Sxiuyan.wang@Sun.COM 	U32 rds_ring_offset;	/* Offset to RDS config */
4667956Sxiuyan.wang@Sun.COM 	U32 sds_ring_offset;	/* Offset to SDS config */
4677956Sxiuyan.wang@Sun.COM 	U32 host_ctx_state;	/* Starting State */
4687956Sxiuyan.wang@Sun.COM 	U32 num_fn_per_port;	/* How many PCI fn share the port */
4697956Sxiuyan.wang@Sun.COM 	U16 num_rds_rings;	/* Count of RDS rings */
4707956Sxiuyan.wang@Sun.COM 	U16 num_sds_rings;	/* Count of SDS rings */
4717956Sxiuyan.wang@Sun.COM 	U16 context_id;		/* Handle for context */
4727956Sxiuyan.wang@Sun.COM 	U8  phys_port;		/* Physical id of port */
4737956Sxiuyan.wang@Sun.COM 	U8  virt_port;		/* Virtual/Logical id of port */
4747956Sxiuyan.wang@Sun.COM 	U8  reserved[128];	/* save space for future expansion */
4757956Sxiuyan.wang@Sun.COM 	/*
4767956Sxiuyan.wang@Sun.COM 	 * MUST BE 64-bit aligned.
4777956Sxiuyan.wang@Sun.COM 	 * The following is packed:
4787956Sxiuyan.wang@Sun.COM 	 * - N cardrsp_rds_rings
4797956Sxiuyan.wang@Sun.COM 	 * - N cardrs_sds_rings
4807956Sxiuyan.wang@Sun.COM 	 */
4817956Sxiuyan.wang@Sun.COM } nx_cardrsp_rx_ctx_t;
4827956Sxiuyan.wang@Sun.COM 
4837956Sxiuyan.wang@Sun.COM #define	SIZEOF_HOSTRQ_RX(HOSTRQ_RX, rds_rings, sds_rings)	\
4847956Sxiuyan.wang@Sun.COM 	(sizeof (HOSTRQ_RX) + 					\
4857956Sxiuyan.wang@Sun.COM 	(rds_rings)*(sizeof (nx_hostrq_rds_ring_t)) +		\
4867956Sxiuyan.wang@Sun.COM 	    (sds_rings)*(sizeof (nx_hostrq_sds_ring_t)))
4877956Sxiuyan.wang@Sun.COM 
4887956Sxiuyan.wang@Sun.COM #define	SIZEOF_CARDRSP_RX(CARDRSP_RX, rds_rings, sds_rings) 	\
4897956Sxiuyan.wang@Sun.COM 	(sizeof (CARDRSP_RX) + 					\
4907956Sxiuyan.wang@Sun.COM 	(rds_rings)*(sizeof (nx_cardrsp_rds_ring_t)) + 		\
4917956Sxiuyan.wang@Sun.COM 	    (sds_rings)*(sizeof (nx_cardrsp_sds_ring_t)))
4927956Sxiuyan.wang@Sun.COM 
4937956Sxiuyan.wang@Sun.COM 
4947956Sxiuyan.wang@Sun.COM /*
4957956Sxiuyan.wang@Sun.COM  *        Statistics
4967956Sxiuyan.wang@Sun.COM  */
4977956Sxiuyan.wang@Sun.COM 
4987956Sxiuyan.wang@Sun.COM /*
4997956Sxiuyan.wang@Sun.COM  * The model of statistics update to use
5007956Sxiuyan.wang@Sun.COM  */
5017956Sxiuyan.wang@Sun.COM 
5027956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_MODE_INVALID		0
5037956Sxiuyan.wang@Sun.COM 
5047956Sxiuyan.wang@Sun.COM /*
5057956Sxiuyan.wang@Sun.COM  * Permanent setup; Updates are only sent on explicit request
5067956Sxiuyan.wang@Sun.COM  * NX_CDRP_CMD_GET_STATISTICS)
5077956Sxiuyan.wang@Sun.COM  */
5087956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_MODE_PULL			1
5097956Sxiuyan.wang@Sun.COM 
5107956Sxiuyan.wang@Sun.COM /*
5117956Sxiuyan.wang@Sun.COM  * Permanent setup; Updates are sent automatically and on
5127956Sxiuyan.wang@Sun.COM  * explicit request (NX_CDRP_CMD_GET_STATISTICS)
5137956Sxiuyan.wang@Sun.COM  */
5147956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_MODE_PUSH			2
5157956Sxiuyan.wang@Sun.COM 
5167956Sxiuyan.wang@Sun.COM /* One time stat update. */
5177956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_MODE_SINGLE_SHOT	3
5187956Sxiuyan.wang@Sun.COM 
5197956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_MODE_MAX			4
5207956Sxiuyan.wang@Sun.COM 
5217956Sxiuyan.wang@Sun.COM /*
5227956Sxiuyan.wang@Sun.COM  * What set of stats
5237956Sxiuyan.wang@Sun.COM  */
5247956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_TYPE_INVALID		0
5257956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_TYPE_NIC_RX_CORE	1
5267956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_TYPE_NIC_TX_CORE	2
5277956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_TYPE_NIC_RX_ALL	3
5287956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_TYPE_NIC_TX_ALL	4
5297956Sxiuyan.wang@Sun.COM #define	NX_STATISTICS_TYPE_MAX			5
5307956Sxiuyan.wang@Sun.COM 
5317956Sxiuyan.wang@Sun.COM 
5327956Sxiuyan.wang@Sun.COM /*
5337956Sxiuyan.wang@Sun.COM  * Request to setup statistics gathering.
5347956Sxiuyan.wang@Sun.COM  * CRB - DOES NOT REQUIRE Rx/TX CONTEXT
5357956Sxiuyan.wang@Sun.COM  */
5367956Sxiuyan.wang@Sun.COM 
5377956Sxiuyan.wang@Sun.COM typedef struct nx_hostrq_stat_setup_s {
5387956Sxiuyan.wang@Sun.COM 	U64 host_stat_buffer;	/* Where to dma stats */
5397956Sxiuyan.wang@Sun.COM 	U32 host_stat_size;	/* Size of stat buffer */
5407956Sxiuyan.wang@Sun.COM 	U16 context_id;		/* Which context */
5417956Sxiuyan.wang@Sun.COM 	U16 stat_type;		/* What class of stats */
5427956Sxiuyan.wang@Sun.COM 	U16 stat_mode;		/* When to update */
5437956Sxiuyan.wang@Sun.COM 	U16 stat_interval;	/* Frequency of update */
5447956Sxiuyan.wang@Sun.COM } nx_hostrq_stat_setup_t;
5457956Sxiuyan.wang@Sun.COM 
546*8687SJing.Xiong@Sun.COM #ifdef __cplusplus
547*8687SJing.Xiong@Sun.COM }
548*8687SJing.Xiong@Sun.COM #endif
5497956Sxiuyan.wang@Sun.COM 
5507956Sxiuyan.wang@Sun.COM #endif /* _NXHAL_NIC_INTERFACE_H_ */
551