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 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 #ifndef _STMF_H 26 #define _STMF_H 27 28 #include <sys/stmf_defines.h> 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 typedef enum stmf_struct_id { 35 STMF_STRUCT_LU_PROVIDER = 1, 36 STMF_STRUCT_PORT_PROVIDER, 37 STMF_STRUCT_STMF_LOCAL_PORT, 38 STMF_STRUCT_STMF_LU, 39 STMF_STRUCT_SCSI_SESSION, 40 STMF_STRUCT_SCSI_TASK, 41 STMF_STRUCT_DATA_BUF, 42 STMF_STRUCT_DBUF_STORE, 43 STMF_MAX_STRUCT_IDS 44 } stmf_struct_id_t; 45 46 /* 47 * Provider callback commands 48 */ 49 #define STMF_PROVIDER_DATA_UPDATED 0x01 50 51 /* 52 * Provider callback flags 53 */ 54 #define STMF_PCB_STMF_ONLINING 0x0001 55 #define STMF_PCB_PREG_COMPLETE 0x0002 56 57 typedef void *data_seg_handle_t; 58 #define STMF_MAX_LU_CACHE_NTASKS 16 59 60 #define STMF_NO_HANDLE 0xffffffff 61 62 #define COMPANY_ID_NONE 0xFFFFFFFF 63 #define COMPANY_ID_SUN 0x00144F 64 65 typedef struct stmf_data_buf { 66 void *db_stmf_private; 67 void *db_port_private; 68 void *db_lu_private; 69 uint32_t db_buf_size; /* Total size of this buffer */ 70 uint32_t db_data_size; /* Intended xfer size of this buffer */ 71 uint32_t db_relative_offset; 72 uint16_t db_sglist_length; 73 uint16_t db_flags; /* Direction, auto status etc */ 74 stmf_status_t db_xfer_status; 75 uint8_t db_handle; /* To track parallel buffers */ 76 struct stmf_sglist_ent { 77 uint32_t seg_length; 78 uint8_t *seg_addr; 79 } db_sglist[1]; 80 } stmf_data_buf_t; 81 82 /* 83 * db_flags 84 */ 85 #define DB_DIRECTION_TO_RPORT 0x0001 86 #define DB_DIRECTION_FROM_RPORT 0x0002 87 #define DB_SEND_STATUS_GOOD 0x0004 88 #define DB_STATUS_GOOD_SENT 0x0008 89 #define DB_DONT_CACHE 0x0010 90 91 typedef struct scsi_task { 92 void *task_stmf_private; 93 void *task_port_private; 94 95 void *task_lu_private; 96 struct stmf_scsi_session *task_session; 97 struct stmf_local_port *task_lport; 98 struct stmf_lu *task_lu; 99 void *task_lu_itl_handle; /* Assigned by LU */ 100 101 /* CMD information from initiator */ 102 uint8_t task_lun_no[8]; 103 uint8_t task_flags; /* See def. for task flags */ 104 uint8_t task_priority; /* As per SAM-3 */ 105 uint8_t task_mgmt_function; /* If this is a TM request */ 106 uint8_t task_max_nbufs; 107 uint8_t task_cur_nbufs; 108 uint8_t task_csn_size; /* cmd seq no size in bits */ 109 uint16_t task_additional_flags; 110 uint32_t task_cmd_seq_no; 111 uint32_t task_expected_xfer_length; 112 uint32_t task_timeout; /* In seconds */ 113 uint16_t task_ext_id; 114 uint16_t task_cdb_length; 115 uint8_t *task_cdb; 116 117 /* Fields to manage data phase */ 118 uint32_t task_cmd_xfer_length; /* xfer len based on CDB */ 119 uint32_t task_nbytes_transferred; 120 121 /* Status Phase */ 122 stmf_status_t task_completion_status; 123 uint32_t task_resid; 124 uint8_t task_status_ctrl; /* See def. for status ctrl */ 125 uint8_t task_scsi_status; 126 uint16_t task_sense_length; 127 uint8_t *task_sense_data; 128 129 /* Misc. task data */ 130 void *task_extended_cmd; 131 132 } scsi_task_t; 133 134 /* 135 * Maximum expected transfer length. Can also be used when the transfer 136 * length is unknown when the task is allocated (e.g. SAS) 137 */ 138 139 #define TASK_MAX_XFER_LENGTH 0xFFFFFFFF 140 141 /* 142 * task_flags definitions. 143 */ 144 /* 145 * If TF_INITIAL_BURST is set, the dbuf passed with new_task() contains 146 * data from initial burst. Otherwise its just a buffer which the port 147 * passed to the LU. 148 */ 149 #define TF_INITIAL_BURST 0x80 150 /* Both READ_DATA and WRITE_DATA can be set for bidirectional xfers */ 151 #define TF_READ_DATA 0x40 152 #define TF_WRITE_DATA 0x20 153 #define TF_ATTR_MASK 0x07 154 #define TF_ATTR_UNTAGGED 0x0 155 #define TF_ATTR_SIMPLE_QUEUE 0x1 156 #define TF_ATTR_ORDERED_QUEUE 0x2 157 #define TF_ATTR_HEAD_OF_QUEUE 0x3 158 #define TF_ATTR_ACA 0x4 159 160 /* 161 * Task Management flags. 162 */ 163 #define TM_NONE 0x00 164 #define TM_ABORT_TASK 0x01 165 #define TM_ABORT_TASK_SET 0x02 166 #define TM_CLEAR_ACA 0x03 167 #define TM_CLEAR_TASK_SET 0x04 168 #define TM_LUN_RESET 0x05 169 #define TM_TARGET_WARM_RESET 0x06 170 #define TM_TARGET_COLD_RESET 0x07 171 #define TM_TASK_REASSIGN 0x08 172 #define TM_TARGET_RESET 0x09 173 #define TM_QUERY_TASK 0x0A 174 175 /* 176 * additional flags 177 */ 178 #define TASK_AF_ENABLE_COMP_CONF 0x01 179 #define TASK_AF_PORT_LOAD_HIGH 0x02 180 #define TASK_AF_NO_EXPECTED_XFER_LENGTH 0x04 181 182 /* 183 * scsi_task_t extension identifiers 184 */ 185 #define STMF_TASK_EXT_NONE 0 186 187 /* 188 * max_nbufs 189 */ 190 #define STMF_BUFS_MAX 255 191 192 /* 193 * Task status ctrl 194 */ 195 #define TASK_SCTRL_OVER 1 196 #define TASK_SCTRL_UNDER 2 197 198 /* 199 * The flags used by I/O flow. 200 */ 201 #define STMF_IOF_LU_DONE 0x0001 202 #define STMF_IOF_LPORT_DONE 0x0002 203 204 /* 205 * struct allocation flags 206 */ 207 #define AF_FORCE_NOSLEEP 0x0001 208 209 typedef struct stmf_state_change_info { 210 uint64_t st_rflags; /* Reason behin this change */ 211 char *st_additional_info; 212 } stmf_state_change_info_t; 213 214 typedef struct stmf_change_status { 215 stmf_status_t st_completion_status; 216 char *st_additional_info; 217 } stmf_change_status_t; 218 219 /* 220 * conditions causing or affecting the change. 221 */ 222 #define STMF_RFLAG_USER_REQUEST 0x0001 223 #define STMF_RFLAG_FATAL_ERROR 0x0002 224 #define STMF_RFLAG_STAY_OFFLINED 0x0004 225 #define STMF_RFLAG_RESET 0x0008 226 #define STMF_RFLAG_COLLECT_DEBUG_DUMP 0x0010 227 #define STMF_RFLAG_LU_ABORT 0x0020 228 #define STMF_RFLAG_LPORT_ABORT 0x0040 229 230 #define STMF_CHANGE_INFO_LEN 160 231 232 /* 233 * cmds to stmf_abort entry point 234 */ 235 #define STMF_QUEUE_TASK_ABORT 1 236 #define STMF_REQUEUE_TASK_ABORT_LPORT 2 237 #define STMF_REQUEUE_TASK_ABORT_LU 3 238 #define STMF_QUEUE_ABORT_LU 4 239 240 /* 241 * cmds to be used by stmf ctl 242 */ 243 #define STMF_CMD_LU_OP 0x0100 244 #define STMF_CMD_LPORT_OP 0x0200 245 #define STMF_CMD_MASK 0x00ff 246 #define STMF_CMD_ONLINE 0x0001 247 #define STMF_CMD_OFFLINE 0x0002 248 #define STMF_CMD_GET_STATUS 0x0003 249 #define STMF_CMD_ONLINE_COMPLETE 0x0004 250 #define STMF_CMD_OFFLINE_COMPLETE 0x0005 251 #define STMF_ACK_ONLINE_COMPLETE 0x0006 252 #define STMF_ACK_OFFLINE_COMPLETE 0x0007 253 254 #define STMF_CMD_LU_ONLINE (STMF_CMD_LU_OP | STMF_CMD_ONLINE) 255 #define STMF_CMD_LU_OFFLINE (STMF_CMD_LU_OP | STMF_CMD_OFFLINE) 256 #define STMF_CMD_LPORT_ONLINE (STMF_CMD_LPORT_OP | STMF_CMD_ONLINE) 257 #define STMF_CMD_LPORT_OFFLINE (STMF_CMD_LPORT_OP | STMF_CMD_OFFLINE) 258 #define STMF_CMD_GET_LU_STATUS (STMF_CMD_LU_OP | STMF_CMD_GET_STATUS) 259 #define STMF_CMD_GET_LPORT_STATUS \ 260 (STMF_CMD_LPORT_OP | STMF_CMD_GET_STATUS) 261 #define STMF_CMD_LU_ONLINE_COMPLETE \ 262 (STMF_CMD_LU_OP | STMF_CMD_ONLINE_COMPLETE) 263 #define STMF_CMD_LPORT_ONLINE_COMPLETE \ 264 (STMF_CMD_LPORT_OP | STMF_CMD_ONLINE_COMPLETE) 265 #define STMF_ACK_LU_ONLINE_COMPLETE \ 266 (STMF_CMD_LU_OP | STMF_ACK_ONLINE_COMPLETE) 267 #define STMF_ACK_LPORT_ONLINE_COMPLETE \ 268 (STMF_CMD_LPORT_OP | STMF_ACK_ONLINE_COMPLETE) 269 #define STMF_CMD_LU_OFFLINE_COMPLETE \ 270 (STMF_CMD_LU_OP | STMF_CMD_OFFLINE_COMPLETE) 271 #define STMF_CMD_LPORT_OFFLINE_COMPLETE \ 272 (STMF_CMD_LPORT_OP | STMF_CMD_OFFLINE_COMPLETE) 273 #define STMF_ACK_LU_OFFLINE_COMPLETE \ 274 (STMF_CMD_LU_OP | STMF_ACK_OFFLINE_COMPLETE) 275 #define STMF_ACK_LPORT_OFFLINE_COMPLETE \ 276 (STMF_CMD_LPORT_OP | STMF_ACK_OFFLINE_COMPLETE) 277 /* 278 * For LPORTs and LUs to create their own ctl cmds which dont 279 * conflict with stmf ctl cmds. 280 */ 281 #define STMF_LPORT_CTL_CMDS 0x1000 282 #define STMF_LU_CTL_CMDS 0x2000 283 284 /* 285 * Commands for various info routines. 286 */ 287 /* Command classifiers */ 288 #define SI_LPORT 0x1000000 289 #define SI_STMF 0x2000000 290 #define SI_LU 0x4000000 291 #define SI_LPORT_FC 0x0000000 292 #define SI_LPORT_ISCSI 0x0010000 293 #define SI_LPORT_SAS 0x0020000 294 #define SI_STMF_LU 0x0010000 295 #define SI_STMF_LPORT 0x0020000 296 297 #define SI_GET_CLASS(v) ((v) & 0xFF000000) 298 #define SI_GET_SUBCLASS(v) ((v) & 0x00FF0000) 299 300 /* Commands for LPORT info routines */ 301 /* XXX - Implement these. */ 302 #if 0 303 #define SI_LPORT_FC_PORTINFO (SI_LPORT | SI_LPORT_FC | 1) 304 #define SI_RPORT_FC_PORTINFO (SI_LPORT | SI_LPORT_FC | 2) 305 #endif 306 307 /* 308 * Events 309 */ 310 #define STMF_EVENT_ALL ((int)-1) 311 #define LPORT_EVENT_INITIAL_LUN_MAPPED 0 312 313 /* 314 * This needs to go into common/ddi/sunddi.h 315 */ 316 #define DDI_NT_STMF "ddi_scsi_target:framework" 317 #define DDI_NT_STMF_LP "ddi_scsi_target:lu_provider" 318 #define DDI_NT_STMF_PP "ddi_scsi_target:port_provider" 319 320 /* 321 * VPD page bits. 322 */ 323 #define STMF_VPD_LU_ID 0x01 324 #define STMF_VPD_TARGET_ID 0x02 325 #define STMF_VPD_TP_GROUP 0x04 326 #define STMF_VPD_RELATIVE_TP_ID 0x08 327 328 /* 329 * Common macros to simplify coding 330 */ 331 #define STMF_SEC2TICK(x_sec) (drv_usectohz((x_sec) * 1000000)) 332 333 void stmf_trace(caddr_t ident, const char *fmt, ...); 334 void *stmf_alloc(stmf_struct_id_t sid, int additional_size, int alloc_flags); 335 void stmf_free(void *struct_ptr); 336 struct scsi_task *stmf_task_alloc(struct stmf_local_port *lport, 337 struct stmf_scsi_session *ss, uint8_t *lun, uint16_t cdb_length, 338 uint16_t ext_id); 339 void stmf_post_task(scsi_task_t *task, stmf_data_buf_t *dbuf); 340 stmf_data_buf_t *stmf_alloc_dbuf(scsi_task_t *task, uint32_t size, 341 uint32_t *pminsize, uint32_t flags); 342 void stmf_free_dbuf(scsi_task_t *task, stmf_data_buf_t *dbuf); 343 stmf_status_t stmf_xfer_data(scsi_task_t *task, stmf_data_buf_t *dbuf, 344 uint32_t ioflags); 345 stmf_status_t stmf_send_scsi_status(scsi_task_t *task, uint32_t ioflags); 346 void stmf_data_xfer_done(scsi_task_t *task, stmf_data_buf_t *dbuf, 347 uint32_t iof); 348 void stmf_send_status_done(scsi_task_t *task, stmf_status_t s, uint32_t iof); 349 void stmf_task_lu_done(scsi_task_t *task); 350 void stmf_abort(int abort_cmd, scsi_task_t *task, stmf_status_t s, void *arg); 351 void stmf_task_lu_aborted(scsi_task_t *task, stmf_status_t s, uint32_t iof); 352 void stmf_task_lport_aborted(scsi_task_t *task, stmf_status_t s, uint32_t iof); 353 stmf_status_t stmf_task_poll_lu(scsi_task_t *task, uint32_t timeout); 354 stmf_status_t stmf_task_poll_lport(scsi_task_t *task, uint32_t timeout); 355 stmf_status_t stmf_ctl(int cmd, void *obj, void *arg); 356 stmf_status_t stmf_register_itl_handle(struct stmf_lu *lu, uint8_t *lun, 357 struct stmf_scsi_session *ss, uint64_t session_id, void *itl_handle); 358 stmf_status_t stmf_deregister_itl_handle(struct stmf_lu *lu, uint8_t *lun, 359 struct stmf_scsi_session *ss, uint64_t session_id, void *itl_handle); 360 stmf_status_t stmf_deregister_all_lu_itl_handles(struct stmf_lu *lu); 361 stmf_status_t stmf_get_itl_handle(struct stmf_lu *lu, uint8_t *lun, 362 struct stmf_scsi_session *ss, uint64_t session_id, void **itl_handle_retp); 363 stmf_data_buf_t *stmf_handle_to_buf(scsi_task_t *task, uint8_t h); 364 stmf_status_t stmf_lu_add_event(struct stmf_lu *lu, int eventid); 365 stmf_status_t stmf_lu_remove_event(struct stmf_lu *lu, int eventid); 366 stmf_status_t stmf_lport_add_event(struct stmf_local_port *lport, int eventid); 367 stmf_status_t stmf_lport_remove_event(struct stmf_local_port *lport, 368 int eventid); 369 void stmf_wwn_to_devid_desc(struct scsi_devid_desc *sdid, uint8_t *wwn, 370 uint8_t protocol_id); 371 stmf_status_t stmf_scsilib_uniq_lu_id(uint32_t company_id, 372 struct scsi_devid_desc *lu_id); 373 void stmf_scsilib_send_status(scsi_task_t *task, uint8_t st, uint32_t saa); 374 uint32_t stmf_scsilib_prepare_vpd_page83(scsi_task_t *task, uint8_t *page, 375 uint32_t page_len, uint8_t byte0, uint32_t vpd_mask); 376 void stmf_scsilib_handle_report_tpgs(scsi_task_t *task, stmf_data_buf_t *dbuf); 377 void stmf_scsilib_handle_task_mgmt(scsi_task_t *task); 378 379 #ifdef __cplusplus 380 } 381 #endif 382 383 #endif /* _STMF_H */ 384