1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  *
21  *
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 /*
26  * SAS Common Structures and Definitions
27  * sas2r14, simplified/reduced
28  */
29 #ifndef	_SAS_H
30 #define	_SAS_H
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/sysmacros.h>
36 /*
37  * SAS Address Frames
38  * Trailing 4 byte CRC not included.
39  */
40 typedef struct {
41 	DECL_BITFIELD3(
42 	    address_frame_type		:4,
43 	    device_type			:3,
44 	    reserved0			:1);
45 	DECL_BITFIELD2(
46 	    reason			:4,
47 	    reserved1			:4);
48 	DECL_BITFIELD5(
49 	    restricted0			:1,
50 	    smp_ini_port		:1,
51 	    stp_ini_port		:1,
52 	    ssp_ini_port		:1,
53 	    reserved2			:4);
54 	DECL_BITFIELD5(
55 	    restricted1			:1,
56 	    smp_tgt_port		:1,
57 	    stp_tgt_port		:1,
58 	    ssp_tgt_port		:1,
59 	    reserved3			:4);
60 	uint8_t		device_name[8];
61 	uint8_t		sas_address[8];
62 	uint8_t		phy_identifier;
63 	DECL_BITFIELD4(
64 	    break_reply_capable		:1,
65 	    requested_inside_zpsds	:1,
66 	    inside_zpsds_persistent	:1,
67 	    reserved4			:5);
68 	uint8_t		reserved5[6];
69 } sas_identify_af_t;
70 
71 typedef struct {
72 	DECL_BITFIELD3(
73 	    address_frame_type		:4,
74 	    protocol			:3,
75 	    ini_port			:1);
76 	DECL_BITFIELD2(
77 	    connection_rate		:4,
78 	    features			:4);
79 	uint16_t 	itag;			/* initiator connection tag */
80 	uint8_t 	sas_dst[8];		/* destination sas address */
81 	uint8_t 	sas_src[8];		/* source sas address */
82 	uint8_t 	src_zone_group;		/* source zone group  */
83 	uint8_t 	path_block_count;	/* pathway blocked count */
84 	uint16_t	arb_wait_time;		/* arbitration wait time */
85 	uint8_t 	compat[4];		/* 'more' compatible features */
86 } sas_open_af_t;
87 
88 #define	SAS_AF_IDENTIFY			0
89 #define	SAS_AF_OPEN			1
90 
91 #define	SAS_IF_DTYPE_ENDPOINT		1
92 #define	SAS_IF_DTYPE_EDGE		2
93 #define	SAS_IF_DTYPE_FANOUT		3	/* obsolete */
94 
95 #define	SAS_OF_PROTO_SMP		0
96 #define	SAS_OF_PROTO_SSP		1
97 #define	SAS_OF_PROTO_STP		2
98 
99 #define	SAS_SSP_SUPPORT			0x8
100 #define	SAS_STP_SUPPORT			0x4
101 #define	SAS_SMP_SUPPORT			0x2
102 
103 
104 #define	SAS_CONNRATE_1_5_GBPS		0x8
105 #define	SAS_CONNRATE_3_0_GBPS		0x9
106 #define	SAS_CONNRATE_6_0_GBPS		0xA
107 
108 #define	SAS_SATA_SUPPORT		0x1
109 #define	SAS_ATTACHED_NAME_OFFSET	52	/* SAS-2 only */
110 
111 /*
112  * SSP Definitions
113  */
114 typedef struct {
115 	uint8_t		lun[8];
116 	uint8_t		reserved0;
117 	DECL_BITFIELD3(
118 	    task_attribute	:2,
119 	    command_priority	:4,
120 	    enable_first_burst	:1);
121 	uint8_t		reserved1;
122 	DECL_BITFIELD2(
123 	    reserved2		:2,
124 	    addi_cdb_len	:6);
125 	uint8_t		cdb[16];
126 	/* additional cdb bytes go here, followed by 4 byte CRC */
127 } sas_ssp_cmd_iu_t;
128 
129 #define	SAS_CMD_TASK_ATTR_SIMPLE	0x00
130 #define	SAS_CMD_TASK_ATTR_HEAD		0x01
131 #define	SAS_CMD_TASK_ATTR_ORDERED	0x02
132 #define	SAS_CMD_TASK_ATTR_ACA		0x04
133 
134 typedef struct {
135 	uint8_t		reserved0[8];
136 	uint16_t	status_qualifier;
137 	DECL_BITFIELD2(
138 	    datapres		:2,
139 	    reserved1		:6);
140 	uint8_t		status;
141 	uint8_t		reserved2[4];
142 	uint32_t	sense_data_length;
143 	uint32_t	response_data_length;
144 	uint8_t		rspd[];
145 	/* response data followed by sense data goes here */
146 } sas_ssp_rsp_iu_t;
147 
148 /* length of bytes up to response data */
149 #define	SAS_RSP_HDR_SIZE		24
150 
151 #define	SAS_RSP_DATAPRES_NO_DATA	0x00
152 #define	SAS_RSP_DATAPRES_RESPONSE_DATA	0x01
153 #define	SAS_RSP_DATAPRES_SENSE_DATA	0x02
154 
155 /*
156  * When the RSP IU is type RESPONSE_DATA,
157  * the first 4 bytes of response data should
158  * be a Big Endian representation of one of
159  * these codes.
160  */
161 #define	SAS_RSP_TMF_COMPLETE		0x00
162 #define	SAS_RSP_INVALID_FRAME		0x02
163 #define	SAS_RSP_TMF_NOT_SUPPORTED	0x04
164 #define	SAS_RSP_TMF_FAILED		0x05
165 #define	SAS_RSP_TMF_SUCCEEDED		0x08
166 #define	SAS_RSP_TMF_INCORRECT_LUN	0x09
167 #define	SAS_RSP_OVERLAPPED_OIPTTA	0x0A
168 
169 /*
170  * Task Management Functions- should be in a SAM definition file
171  */
172 #define	SAS_ABORT_TASK			0x01
173 #define	SAS_ABORT_TASK_SET		0x02
174 #define	SAS_CLEAR_TASK_SET		0x04
175 #define	SAS_LOGICAL_UNIT_RESET		0x08
176 #define	SAS_I_T_NEXUS_RESET		0x10
177 #define	SAS_CLEAR_ACA			0x40
178 #define	SAS_QUERY_TASK			0x80
179 #define	SAS_QUERY_TASK_SET		0x81
180 #define	SAS_QUERY_UNIT_ATTENTION	0x82
181 
182 /*
183  * PHY size changed from SAS1.1 to SAS2.
184  */
185 #define	SAS_PHYNUM_MAX			127
186 #define	SAS_PHYNUM_MASK			0x7f
187 
188 #define	SAS2_PHYNUM_MAX			254
189 #define	SAS2_PHYNUM_MASK		0xff
190 
191 
192 /*
193  * Maximum SMP payload size, including CRC
194  */
195 #define	SAS_SMP_MAX_PAYLOAD		1032
196 #ifdef	__cplusplus
197 }
198 #endif
199 #endif	/* _SAS_H */
200