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 #ifndef _FCP_H 27 #define _FCP_H 28 29 /* 30 * Frame format and protocol definitions for transferring 31 * commands and data between a SCSI initiator and target 32 * using an FC4 serial link interface. 33 * 34 * this file originally taken from fc4/fcp.h 35 */ 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 #include <sys/types.h> 42 43 44 /* 45 * FCP Device Data Frame Information Categories 46 */ 47 #define FCP_SCSI_DATA 0x01 /* frame contains SCSI data */ 48 #define FCP_SCSI_CMD 0x02 /* frame contains SCSI command */ 49 #define FCP_SCSI_RSP 0x03 /* frame contains SCSI response */ 50 #define FCP_SCSI_XFER_RDY 0x05 /* frame contains xfer rdy block */ 51 52 /* 53 * fcp SCSI control structure 54 */ 55 typedef struct fcp_cntl { 56 57 uchar_t cntl_reserved_0; /* reserved */ 58 59 #if defined(_BIT_FIELDS_HTOL) 60 61 uchar_t cntl_reserved_1 : 5, /* reserved */ 62 cntl_qtype : 3; /* tagged queueing type */ 63 64 uchar_t cntl_kill_tsk : 1, /* terminate task */ 65 cntl_clr_aca : 1, /* clear aca */ 66 cntl_reset_tgt : 1, /* reset target */ 67 cntl_reset_lun : 1, /* reset lun */ 68 cntl_reserved_2 : 1, /* reserved */ 69 cntl_clr_tsk : 1, /* clear task set */ 70 cntl_abort_tsk : 1, /* abort task set */ 71 cntl_reserved_3 : 1; /* reserved */ 72 73 uchar_t cntl_reserved_4 : 6, /* reserved */ 74 cntl_read_data : 1, /* initiator read */ 75 cntl_write_data : 1; /* initiator write */ 76 77 #elif defined(_BIT_FIELDS_LTOH) 78 79 uchar_t cntl_qtype : 3, /* tagged queueing type */ 80 cntl_reserved_1 : 5; /* reserved */ 81 82 uchar_t cntl_reserved_3 : 1, /* reserved */ 83 cntl_abort_tsk : 1, /* abort task set */ 84 cntl_clr_tsk : 1, /* clear task set */ 85 cntl_reserved_2 : 1, /* reserved */ 86 cntl_reset_lun : 1, /* reset lun */ 87 cntl_reset_tgt : 1, /* reset target */ 88 cntl_clr_aca : 1, /* clear aca */ 89 cntl_kill_tsk : 1; /* terminate task */ 90 91 uchar_t cntl_write_data : 1, /* initiator write */ 92 cntl_read_data : 1, /* initiator read */ 93 cntl_reserved_4 : 6; /* reserved */ 94 95 #else 96 #error one of _BIT_FIELDS_HTOL or _BIT_FIELDS_LTOH must be defined 97 #endif 98 99 } fcp_cntl_t; 100 101 /* 102 * fcp SCSI control tagged queueing types - cntl_qtype 103 */ 104 #define FCP_QTYPE_SIMPLE 0 /* simple queueing */ 105 #define FCP_QTYPE_HEAD_OF_Q 1 /* head of queue */ 106 #define FCP_QTYPE_ORDERED 2 /* ordered queueing */ 107 #define FCP_QTYPE_ACA_Q_TAG 4 /* ACA queueing */ 108 #define FCP_QTYPE_UNTAGGED 5 /* Untagged */ 109 110 /* 111 * fcp SCSI entity address 112 * 113 * ent_addr_0 is always the first and highest layer of 114 * the hierarchy. The depth of the hierarchy of addressing, 115 * up to a maximum of four layers, is arbitrary and 116 * device-dependent. 117 */ 118 typedef struct fcp_ent_addr { 119 ushort_t ent_addr_0; /* entity address 0 */ 120 ushort_t ent_addr_1; /* entity address 1 */ 121 ushort_t ent_addr_2; /* entity address 2 */ 122 ushort_t ent_addr_3; /* entity address 3 */ 123 } fcp_ent_addr_t; 124 125 /* 126 * maximum size of SCSI cdb in fcp SCSI command 127 */ 128 #define FCP_CDB_SIZE 16 129 #define FCP_LUN_SIZE 8 130 #define FCP_LUN_HEADER 8 131 132 /* 133 * FCP SCSI command payload 134 */ 135 typedef struct fcp_cmd { 136 fcp_ent_addr_t fcp_ent_addr; /* entity address */ 137 fcp_cntl_t fcp_cntl; /* SCSI options */ 138 uchar_t fcp_cdb[FCP_CDB_SIZE]; /* SCSI cdb */ 139 int fcp_data_len; /* data length */ 140 } fcp_cmd_t; 141 142 /* 143 * fcp SCSI status 144 */ 145 typedef struct fcp_status { 146 ushort_t reserved_0; /* reserved */ 147 148 #if defined(_BIT_FIELDS_HTOL) 149 150 uchar_t reserved_1 : 4, /* reserved */ 151 resid_under : 1, /* resid non-zero */ 152 resid_over : 1, /* resid non-zero */ 153 sense_len_set : 1, /* sense_len non-zero */ 154 rsp_len_set : 1; /* response_len non-zero */ 155 156 #elif defined(_BIT_FIELDS_LTOH) 157 158 uchar_t rsp_len_set : 1, /* response_len non-zero */ 159 sense_len_set : 1, /* sense_len non-zero */ 160 resid_over : 1, /* resid non-zero */ 161 resid_under : 1, /* resid non-zero */ 162 reserved_1 : 4; /* reserved */ 163 164 #endif 165 uchar_t scsi_status; /* status of cmd */ 166 } fcp_status_t; 167 168 /* 169 * fcp SCSI response payload 170 */ 171 typedef struct fcp_rsp { 172 uint32_t reserved_0; /* reserved */ 173 uint32_t reserved_1; /* reserved */ 174 union { 175 fcp_status_t fcp_status; /* command status */ 176 uint32_t i_fcp_status; 177 } fcp_u; 178 uint32_t fcp_resid; /* resid of operation */ 179 uint32_t fcp_sense_len; /* sense data length */ 180 uint32_t fcp_response_len; /* response data length */ 181 /* 182 * 'm' bytes of scsi response info follow 183 * 'n' bytes of scsi sense info follow 184 */ 185 } fcp_rsp_t; 186 187 /* MAde 256 for sonoma as it wants to give tons of sense info */ 188 #define FCP_MAX_RSP_IU_SIZE 256 189 190 /* 191 * fcp rsp_info field format 192 */ 193 struct fcp_rsp_info { 194 uchar_t resvd1; 195 uchar_t resvd2; 196 uchar_t resvd3; 197 uchar_t rsp_code; 198 uchar_t resvd4; 199 uchar_t resvd5; 200 uchar_t resvd6; 201 uchar_t resvd7; 202 }; 203 204 /* 205 * rsp_code definitions 206 */ 207 #define FCP_NO_FAILURE 0x0 208 #define FCP_DL_LEN_MISMATCH 0x1 209 #define FCP_CMND_INVALID 0x2 210 #define FCP_DATA_RO_MISMATCH 0x3 211 #define FCP_TASK_MGMT_NOT_SUPPTD 0x4 212 #define FCP_TASK_MGMT_FAILED 0x5 213 214 #ifdef THIS_NEEDED_YET 215 216 /* 217 * fcp scsi_xfer_rdy payload 218 */ 219 typedef struct fcp_xfer_rdy { 220 ulong64_t fcp_seq_offset; /* relative offset */ 221 ulong64_t fcp_burst_len; /* buffer space */ 222 ulong64_t reserved; /* reserved */ 223 } fcp_xfer_rdy_t; 224 225 #endif /* THIS_NEEDED_YET */ 226 227 /* 228 * fcp PRLI payload 229 */ 230 struct fcp_prli { 231 uchar_t type; 232 uchar_t resvd1; /* rsvd by std */ 233 234 #if defined(_BIT_FIELDS_HTOL) 235 236 uint16_t orig_process_assoc_valid : 1, 237 resp_process_assoc_valid : 1, 238 establish_image_pair : 1, 239 resvd2 : 13; /* rsvd by std */ 240 241 #elif defined(_BIT_FIELDS_LTOH) 242 243 uint16_t resvd2 : 13, /* rsvd by std */ 244 establish_image_pair : 1, 245 resp_process_assoc_valid : 1, 246 orig_process_assoc_valid : 1; 247 248 #endif 249 250 uint32_t orig_process_associator; 251 uint32_t resp_process_associator; 252 253 #if defined(_BIT_FIELDS_HTOL) 254 255 uint32_t resvd3 : 23, /* rsvd by std */ 256 retry : 1, 257 confirmed_compl_allowed : 1, 258 data_overlay_allowed : 1, 259 initiator_fn : 1, 260 target_fn : 1, 261 obsolete_2 : 1, 262 obsolete_1 : 1, 263 read_xfer_rdy_disabled : 1, 264 write_xfer_rdy_disabled : 1; 265 266 #elif defined(_BIT_FIELDS_LTOH) 267 268 uint32_t write_xfer_rdy_disabled : 1, 269 read_xfer_rdy_disabled : 1, 270 obsolete_1 : 1, 271 obsolete_2 : 1, 272 target_fn : 1, 273 initiator_fn : 1, 274 data_overlay_allowed : 1, 275 confirmed_compl_allowed : 1, 276 retry : 1, 277 resvd3 : 23; /* rsvd by std */ 278 279 #endif 280 281 }; 282 283 /* 284 * fcp PRLI ACC payload 285 */ 286 struct fcp_prli_acc { 287 uchar_t type; 288 uchar_t resvd1; /* type code extension */ 289 290 #if defined(_BIT_FIELDS_HTOL) 291 uint16_t orig_process_assoc_valid : 1, 292 resp_process_assoc_valid : 1, 293 image_pair_established : 1, 294 resvd2 : 1, 295 accept_response_code : 4, 296 resvd3 : 8; 297 #elif defined(_BIT_FIELDS_LTOH) 298 uint16_t resvd3 : 8, 299 accept_response_code : 4, 300 resvd2 : 1, 301 image_pair_established : 1, 302 resp_process_assoc_valid : 1, 303 orig_process_assoc_valid : 1; 304 #endif 305 306 uint32_t orig_process_associator; 307 uint32_t resp_process_associator; 308 309 #if defined(_BIT_FIELDS_HTOL) 310 uint32_t resvd4 : 26, 311 initiator_fn : 1, 312 target_fn : 1, 313 cmd_data_mixed : 1, 314 data_resp_mixed : 1, 315 read_xfer_rdy_disabled : 1, 316 write_xfer_rdy_disabled : 1; 317 #elif defined(_BIT_FIELDS_LTOH) 318 uint32_t write_xfer_rdy_disabled : 1, 319 read_xfer_rdy_disabled : 1, 320 data_resp_mixed : 1, 321 cmd_data_mixed : 1, 322 target_fn : 1, 323 initiator_fn : 1, 324 resvd4 : 26; 325 #endif 326 }; 327 328 #define FC_UB_FCP_CDB_FLAG 0x0001 /* UB has valid cdb */ 329 #define FC_UB_FCP_PORT_LOGOUT 0x0002 /* Port logout UB */ 330 #define FC_UB_FCP_ABORT_TASK 0x0004 /* Abort task UB */ 331 #define FC_UB_FCP_BUS_RESET 0x0008 /* Bus reset UB */ 332 #define FC_UB_FCP_CMD_DONE 0x8000 /* Work on this UB is done */ 333 334 #define FC_UB_FCP_OOB_CMD (FC_UB_FCP_PORT_LOGOUT | FC_UB_FCP_ABORT_TASK \ 335 | FC_UB_FCP_BUS_RESET) /* Out-of-band traget cmds */ 336 337 338 #if !defined(__lint) 339 _NOTE(SCHEME_PROTECTS_DATA("Unshared Data", 340 fcp_cmd 341 fcp_rsp 342 fcp_prli)) 343 #endif /* __lint */ 344 345 /* 346 * FC4 type setttings for Name Server registration. 347 */ 348 #define FC4_TYPE_WORD_POS(x) ((uchar_t)(x) >> 5) 349 #define FC4_TYPE_BIT_POS(x) ((uchar_t)(x) & 0x1F) 350 351 #ifdef __cplusplus 352 } 353 #endif 354 355 #endif /* _FCP_H */ 356