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